8wDlpd.png
8wDFp9.png
8wDEOx.png
8wDMfH.png
8wDKte.png

将数组作为参数从 PowerShell 传递给 SQL 脚本

PruSafiiX 1月前

16 0

我正在创建一个相当复杂的 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 列表呢?

帖子版权声明 1、本帖标题:将数组作为参数从 PowerShell 传递给 SQL 脚本
    本站网址:http://xjnalaquan.com/
2、本网站的资源部分来源于网络,如有侵权,请联系站长进行删除处理。
3、会员发帖仅代表会员个人观点,并不代表本站赞同其观点和对其真实性负责。
4、本站一律禁止以任何方式发布或转载任何违法的相关信息,访客发现请向站长举报
5、站长邮箱:yeweds@126.com 除非注明,本帖由PruSafiiX在本站《powershell》版块原创发布, 转载请注明出处!
最新回复 (0)
  • 我从根本上同意 这个答案 - 使用 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"
    
返回
作者最近主题: