运行 Invoke-SqlCmd 时传递字符串参数吗?

ca9*_*3d9 5 sql-server powershell

我有一个参数类型为 的存储过程nvarchar(max)。我需要在 PowerShell 中调用它。

// $s can be a long string with all kind of charaters, ', new line, etc.
Invoke-Sqlcmd -ServerInstance Server "exec MyProc '$s'"
Run Code Online (Sandbox Code Playgroud)

$s但是,当has (我知道我可以通过将''替换为but 来处理这种情况)或 等时,上述调用不能很好地工作。而且它还存在 SQL 注入的风险。'''\n\r

这是一种无需字符串连接即可调用存储的方法吗?

Mas*_*all -1

使用-Variable参数Invoke-Sqlcmd.

$vars = @("VAR1=$s")
Invoke-SqlCmd -ServerInstance Server "exec MyProc @procParam=`$(VAR1)" -Variable $vars
Run Code Online (Sandbox Code Playgroud)

这将自动转义特殊字符并避免 SQL 注入。

我相信(如果我错了,请纠正我)您需要说明要传递给存储过程的参数。这就是@procParam上面代码中的内容。

注意:反引号美元符号 ( `$) 很重要,否则字符串将在到达函数之前展开,从而导致错误。您还可以将引号切换为单引号,这样就不需要反引号了。

编辑

需要注意的是,-Variable仅接受 String 数组。这意味着要删除单个值,您必须使用语法@()来表示数组(如示例中所示)。

参考:Invoke-Sqlcmd