首页 > 解决方案 > 从 PowerShell 执行时,62,00,000 条记录的 SQL Server 上的批量插入超时

问题描述

我正在我的 PowerShell 脚本中执行以下命令。

$SqlQuery = "BULK INSERT $tableName FROM '$fileContainingFolderPath' WITH (BATCHSIZE = 80000, FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0a', TABLOCK)"
        
        $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
        $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; User ID = $uid; Password = $pwd; Connection Timeout=120"
        $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
        $SqlCmd.CommandText = $SqlQuery
        $SqlCmd.Connection = $SqlConnection
        $SqlAdapter = New-Object System.Data.SqlClient.SqlDataAdapter
        $SqlAdapter.SelectCommand = $SqlCmd 
        $DataSet = New-Object System.Data.DataSet
        $SqlAdapter.Fill($DataSet)
        $SqlConnection.Close()

它遇到超时异常;它有时会起作用,但会超时。

我能做些什么?对于较小的文件,它不会失败。

使用“1”参数调用“填充”的异常:“执行超时已过期。在操作完成之前超时时间已过或服务器没有响应。”

标签: sql-serverpowershell

解决方案


您只设置了 ConnectionTimeout,而不是默认为 30 秒的 CommandTimeout。

所以设置CommandTimeout并且不要使用 DataAdapter,因为这个查询不返回结果:

    $SqlQuery = "BULK INSERT $tableName FROM '$fileContainingFolderPath' WITH (BATCHSIZE = 102400, FIRSTROW = 2, FIELDTERMINATOR = ',', ROWTERMINATOR = '0x0a', TABLOCK)"
    
    $SqlConnection = New-Object System.Data.SqlClient.SqlConnection
    $SqlConnection.ConnectionString = "Server = $SQLServer; Database = $SQLDBName; User ID = $uid; Password = $pwd; Connection Timeout=120"
    $SqlCmd = New-Object System.Data.SqlClient.SqlCommand
    $SqlCmd.CommandText = $SqlQuery
    $SqlCmd.Connection = $SqlConnection
    $SqlCmd.CommandTimeout = 0
    $SqlCmd.ExecuteNonQuery()

    $SqlConnection.Close()

推荐阅读