我有一个参数类型为 nvarchar(max)
的存储过程.我需要在 PowerShell 中调用它。
// $s can be a long string with all kind of charaters, ', new line, etc.
Invoke-Sqlcmd -ServerInstance Server "exec MyProc '$s'"
然而,上述调用在
$s
时效果不佳。有 '
(我知道我可以通过将 '
' 替换为 ''
来处理这种情况,但是)或 \n\r
等。它也有SQL注入(inject)的风险。这是一种在没有字符串连接的情况下调用存储的方法吗?
最佳答案
使用 -Variable
Invoke-Sqlcmd
的参数.
$vars = @("VAR1=$s")
Invoke-SqlCmd -ServerInstance Server "exec MyProc @procParam=`$(VAR1)" -Variable $vars
这将自动转义特殊字符并避免 SQL 注入(inject)。
我相信(如果我错了,请纠正我)您需要说明要传递给存储过程的参数。这就是
@procParam
在上面的代码中。注意:反引号美元符号(
`$
)很重要,否则字符串将在到达函数之前被扩展,这将导致错误。您还可以将引号切换为单引号,这样就不需要反引号。编辑
需要注意的是
-Variable
只接受一个字符串数组。这意味着要删除单个值,您必须使用语法 @()
表示一个数组(如示例中所示)。引用:
Invoke-Sqlcmd
关于sql-server - 运行 Invoke-SqlCmd 时传递字符串参数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56977602/