You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 20:34:50