PowerShell执行SQL Bulk Insert时遇Cannot index into a null array错误
PowerShell批量插入SQL Server表的行数捕获问题
脚本内容
$server = "MYSERVER" $database = "ERDS_LANDING" $table = "load.load_FRONTARENA_Cashflow" $query = @" DECLARE @loadedRowCount INT; BULK INSERT $table FROM '\\My Directory\Bond_1_1_20240913_1374d9f6-bbbd-4224-a570-bfa96d351f19.CSV' WITH ( DATAFILETYPE='char' , CODEPAGE='raw' , FIELDTERMINATOR = ',' , FIRSTROW = 2 , FORMATFILE='\\My Directory\load_FRONTARENA_Cashflow.fmt' ) select @@ROWCOUNT AS Row_Count; "@ # Create a new SQL connection $connectionString = "Server=$server;Database=$database;Integrated Security=True;" $connection = New-Object System.Data.SqlClient.SqlConnection $connection.ConnectionString = $connectionString #$connection.open # Create the SQL command $command = $connection.CreateCommand() $command.CommandText = $query # Create the DataAdapter $dataAdapter = New-Object System.Data.SqlClient.SqlDataAdapter $dataAdapter.SelectCommand = $command $dataSet = New-Object System.Data.DataSet $dataAdapter.Fill($dataSet) $rowCount = $dataSet.Tables[0].Rows[0]["Row_Count"] "Row count: $rowCount" $connection.Close()
错误信息
1 Cannot index into a null array. At line:40 char:1 + $rowCount = $dataSet.Tables[1].Rows[0]["Row_Count"] + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + CategoryInfo : InvalidOperation: (:) [], RuntimeException + FullyQualifiedErrorId : NullArray Row count: 6246
1. 为什么会出现空数组索引错误?
你实际执行的代码中使用了$dataSet.Tables[1]访问结果表,但你的SQL查询仅返回一个结果集(即最后的select @@ROWCOUNT语句的输出),因此$dataSet.Tables集合中只有索引为0的表,索引1对应的表不存在(值为null),尝试访问null对象的Rows属性就会触发“无法索引到空数组”的错误。
2. 数字1在此场景下代表什么?
这个1是$dataAdapter.Fill($dataSet)方法的返回值——该方法会返回填充到DataSet中的行数。因为你的select @@ROWCOUNT语句仅返回1行数据(包含插入行数的单行结果),所以Fill方法返回1。
3. 如何仅将行数赋值给变量,以便后续条件判断使用?
需要两步修正:
第一步:修复SQL查询的行数捕获逻辑
你的查询中声明了@loadedRowCount变量但未使用,且直接select @@ROWCOUNT存在风险(后续语句可能意外覆盖@@ROWCOUNT的值),应将BULK INSERT的行数先存入变量再返回:
DECLARE @loadedRowCount INT; BULK INSERT $table FROM '\\My Directory\Bond_1_1_20240913_1374d9f6-bbbd-4224-a570-bfa96d351f19.CSV' WITH ( DATAFILETYPE='char' , CODEPAGE='raw' , FIELDTERMINATOR = ',' , FIRSTROW = 2 , FORMATFILE='\\My Directory\load_FRONTARENA_Cashflow.fmt' ) SET @loadedRowCount = @@ROWCOUNT; -- 将BULK INSERT的行数存入变量 SELECT @loadedRowCount AS Row_Count; -- 返回变量值
第二步:稳健地获取行数变量
在PowerShell中增加空值检查,避免因结果集为空导致的错误:
$dataAdapter.Fill($dataSet) | Out-Null # 抑制Fill方法的返回值输出 $rowCount = 0 # 默认值 if ($dataSet.Tables.Count -gt 0 -and $dataSet.Tables[0].Rows.Count -gt 0) { $rowCount = [int]$dataSet.Tables[0].Rows[0]["Row_Count"] } "Row count: $rowCount" # 后续条件判断示例 if ($rowCount -gt 0) { Write-Host "成功插入$rowCount行数据" } else { Write-Host "未插入任何数据" }
内容的提问来源于stack exchange,提问作者Eseosa Omoregie
相关产品推荐
相关产品推荐

