Powershell:如何用引号括起一个字符串数组,以便SQL“IN”运算符有效?

时间:2017-01-30 20:20:33

标签: powershell

我基本上要求用户输入一些用逗号分隔的formIds,并将该字符串传递给执行SQL查询更新的函数。问题是我无法使用IN运算符,因为查询必须采用以下格式:“(''),('')”。

我想让这个查询起作用:

UPDATE [dbo].[Details] SET Field1 = 0 WHERE FormId in ('123','456','789')

为此我想接受这个用户输入:

  

123456789

我怎样才能让它发挥作用?

Function Execute-Query([String[]] $FormIds)
{
$arr = $FormIds -split ','

ForEach ($formId in $arr)
{
    echo $formId
}
$dataSource = "x"
$user = "x"
$pwd = ""x
$database = "x"
$connectionString = "Server=$dataSource;uid=$user; pwd=$pwd;Database=$database;Integrated Security=False;"

$sqlcmd = new-object "System.data.sqlclient.sqlcommand"
$sqlcmd.connection = $con
$sqlcmd.CommandTimeout = 600000
$sqlcmd.CommandText = “UPDATE [dbo].[Details] SET Field1 = 0 WHERE FormId in (????)”
$rowsAffected = $sqlcmd.ExecuteNonQuery()

$connection.Close()

}
$strFormIds = Read-Host "Enter FormIds:"
Execute-Query $strFormIds

2 个答案:

答案 0 :(得分:2)

不确定IN如何发挥作用,但假设您只想在示例中构建查询字符串,请在代码中使用以下子表达式而不是????

$("'" + ($FormIds -join "','") + "'")

也就是说,您的Read-Host来电不会自动将您的'123','456','789'用户输入转换为个别字符串数组 - 相反,它会创建单个< / em> -element数组,其唯一元素是整个字符串

因此,您必须首先将单字符串用户输入显式解析为数组,如下所示:

[string[]] $formIds = $strFormIds -split '[, ]' -ne ''

请注意要分割的字符集 - ,<space> - 这样123,456123, 456甚至123 456都可以使用。例如,-ne ''部分过滤掉由多个相邻空格产生的空元素。

答案 1 :(得分:0)

如果你使用双引号将id传递给你的方法,如下所示,你不能直接使用$ FormIds变量(假设你已经验证了它并在当然删除了潜在的sql注入之外)?

Function Execute-Query([String[]] $FormIds)
{
    $query = "UPDATE [dbo].[Details] SET Field1 = 0 WHERE FormId in ($FormIds)"
    $sqlcmd.CommandText = $query
    Write-Host $query
}

Execute-Query "'123','456','789'"

这应输出:

UPDATE [dbo].[Details] SET Field1 = 0 WHERE FormId in ('123','456','789')