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

标签 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'"

然而,上述调用在 $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/

相关文章:

c# - 如何使用 C# 在 exchange server 中获取日历的用户权限

powershell - 对于执行另一个Powershell的Powershell, “&”和 “.”有什么区别

sql - 将表达式转换为数据类型 int 以进行基本统计时发生算术溢出错误

Powershell 过滤器 csv

PowerShell New-Item 将创建脚本所在的目录,而不是指定的路径

PowerShell 输出不是预期的

sql - 为什么这个删除语句有效?

sql - 在sql脚本中指定服务器

java - 如何将连接传递给 Mybatis

c# - 需要 SQL Server 数据库和应用程序设计级别建议。数据库或应用程序中的约束?