我正在编写一个PowerShell脚本,该脚本使用SQLCMD进行调用以执行.sql文件并输出CSV文件。在SQLCMD命令中,我想将一个包含逗号分隔列表值的参数传递回查询,以便可以在“ IN”语句中使用。
select a, b, c, d
from dbtbl (nolock)
where client_id in ($(clients))
如果我将$ client_id分配给一个奇异值(即'000_abc'),则SQLCMD命令有效,但如果我将该变量分配为数组,则该SQLCMD命令无效。即“ 000_abc”,“ 000_def”,“ 000_ghi”
# Input variables
$SQLSourceFolder = "V:\PS\queries\"
$FolderFile = "V:\PS\Myoutput.csv"
$TaxCode = "MY*script*.sql"
$qtr = "'1'"
$year = "'2019'"
#Works Fine. Only one client filtered in SQL query where clause
$client_id = "'000_abc'"
#Doesn't Work. Multiple clients filtered in SQL query where clause with IN statement.
# $client_id = "'000_abc','000_def', '000_ghi'"
# Find all files matching $TaxCode filter in the folder specified
Get-ChildItem -Path $SQLSourceFolder -Filter $TaxCode | ForEach-Object {
cls
Start-Process "D:\Program Files\Microsoft SQL Server\Client SDK\ODBC\110\Tools\Binn\SQLCMD.EXE" -ArgumentList @("-S","tcp:XXXXXXXXXXXXXX,1433", "-d" ,"XXX", "-U", "XXXXXXXX", "-P" ,"XXXXXXXXXX", " -v", " qtr = $qtr", " yr = $year", " clients = $client_id", " -W ", "-s", "~", "-i", "$($_.FullName)", "-o", "$FolderFile")
}
预期结果是将多值变量传递给sql查询,其中带IN语句的where子句中使用参数。
答案 0 :(得分:0)
您为什么使用sqlcmd.exe
而不是Invoke-SqlCmd
,或者更好的是Invoke-SqlCmd2
?
快速上下文:
Invoke-SqlCmd2
是Invoke-SqlCmd
的社区替代品,它解决了一些问题。它被广泛认为是从PS查询MS SQL的最佳解决方案。相关:Install-Module Invoke-SqlCmd2
,https://github.com/sqlcollaborative/Invoke-SqlCmd2
正如您所发现的,将参数传递给本机应用程序非常困难。根据我的经验,最好使用PS命令。
让我知道是否有充分的理由不使用Invoke-SqlCmd2
,我将为您模拟一下,我会做些什么,但这对我来说是一项不小的努力,所以我鼓励您只需遵循正常做法!