sql-server - 从 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”参数调用“填充”的异常:“执行超时已过期。在操作完成之前超时时间已过或服务器没有响应。”
解决方案
您只设置了 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()
推荐阅读
- ios - iOS 崩溃:com.apple.main-thread EXC_BAD_ACCESS KERN_INVALID_ADDRESS 0x0000000000000000
- javascript - 更改 PWA 的“添加到主屏幕”弹出标题
- php - 如何设置大写字符等于小写字符,PHP
- algorithm - 找出一个值是否存在于多个集合中的最佳和最有效的算法
- c++ - 从带有动画的图像创建视频
- bash - 使用 CURL 设置电子邮件密件抄送
- node.js - 如何将值附加到 NodeJS 中的 PATH 环境变量?
- python - model.to(device) 和 model=model.to(device) 有什么区别?
- asp.net-core - IdentityServer4 登录接口
- python - localhost8888 下的 Jupyter Notebook 无法连接