我基本上要求用户输入一些用逗号分隔的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
答案 0 :(得分:2)
不确定IN
如何发挥作用,但假设您只想在示例中构建查询字符串,请在代码中使用以下子表达式而不是????
:
$("'" + ($FormIds -join "','") + "'")
也就是说,您的Read-Host
来电不会自动将您的'123','456','789'
用户输入转换为个别字符串数组 - 相反,它会创建单个< / em> -element数组,其唯一元素是整个字符串 。
因此,您必须首先将单字符串用户输入显式解析为数组,如下所示:
[string[]] $formIds = $strFormIds -split '[, ]' -ne ''
请注意要分割的字符集 - ,
和<space>
- 这样123,456
和123, 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')