我正在创建一个相当复杂的 SQL 脚本,用于从数据库中删除一堆记录。因为我必须执行大量操作,所以我想将要删除的记录的 ID 保存在临时文件中...
我正在创建一个相当复杂的 SQL 脚本,用于从数据库中删除一堆记录。因为我必须执行很多操作,所以我想将要删除的记录的 ID 保存在临时表中
DECLARE @RunIDsToDelete TABLE (RunID INT);
INSERT INTO @RunIDsToDelete (RunID)
VALUES
N'$(runIDs)'
要删除的 ID 列表(要保存在表中的别名)必须是来自 PowerShell 脚本的参数。SQL 脚本必须将我想要读取的确认信息发送回 PowerShell 脚本。
$runIds = @(1, 2)
$paramList = $runIds -join ","
$sqlCommand = "sqlcmd -S sql1 -d mydb -i $($sqlScriptPath) -v IDs=$paramList"
我的第一次尝试是准备列表并将结果字符串传递给 SQL 脚本,但我收到此错误
sqlcmd:Sqlcmd:“,(2),(4)”:参数无效。输入“-?”获取帮助。
+ CategoryInfo : NotSpecified: (Sqlcmd: ',(2),(... '-?' for help.:String) [], RemoteException + FullyQualifiedErrorId : NativeCommandError
然后,我尝试传递这样的字符串
$sqlCommand = "sqlcmd -S sql1 -d myDb -i $($sqlScriptPath) -v IDs=""(1), (2)"""
但我又遇到了同样的错误。那么我该如何传递 ID 列表呢?
我从根本上同意 这个答案 - 使用 DbaTools 可以让你的生活更轻松 - 但是你可以从 PowerShell 以编程方式执行此操作而无需调用任何外部工具:
$runIDs = @(1, 2, 3)
# establish connection
$connection = [System.Data.SqlClient.SqlConnection]::new("connection string goes here")
$connection.Open()
# define the first part of the command text
$cmdTextPreamble = @'
DECLARE @RunIDsToDelete TABLE (RunID INT);
INSERT INTO @RunIDsToDelete (RunID)
VALUES
'@
# create a command object
$cmd = [System.Data.SqlClient.SqlCommand]::new()
$cmd.Connection = $connection
# now construct the final command text, one insertion at a time
$cmdText = $cmdTextPreamble
for ($i = 0; $i -lt $runIDs.Count; $i++) {
# calculate the next parameter name
$paramName = "@runID${i}"
# add the parameterized value set to the command text
$cmdText += "(${paramName}),"
# and bind the corresponding value to the parameter name
$cmd.Parameters.AddWithValue($paramName, $runIDs[$i]) |Out-Null
}
# remove trailing `,` from the command text and update the $cmd object
$cmd.CommandText = $cmdText.TrimEnd(',')
# execute insert command
$rowCount = $cmd.ExecuteNonQuery()
Write-Host "Inserted ${rowCount} rows into table"