如何通过Powershell使用SQLCMD添加值逗号分隔的参数调用SQL查询

时间:2019-06-12 18:04:51

标签: sql variables powershell-2.0 sqlcmd

我正在编写一个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子句中使用参数。

1 个答案:

答案 0 :(得分:0)

您为什么使用sqlcmd.exe而不是Invoke-SqlCmd,或者更好的是Invoke-SqlCmd2

  

快速上下文:Invoke-SqlCmd2Invoke-SqlCmd的社区替代品,它解决了一些问题。它被广泛认为是从PS查询MS SQL的最佳解决方案。相关:Install-Module Invoke-SqlCmd2https://github.com/sqlcollaborative/Invoke-SqlCmd2

正如您所发现的,将参数传递给本机应用程序非常困难。根据我的经验,最好使用PS命令。

让我知道是否有充分的理由不使用Invoke-SqlCmd2,我将为您模拟一下,我会做些什么,但这对我来说是一项不小的努力,所以我鼓励您只需遵循正常做法!