首页 > 解决方案 > 如何通过 Powershell 使用 SQLCMD 添加值逗号分隔的参数调用 SQL 查询

问题描述

我正在编写一个使用 SQLCMD 调用以执行 .sql 文件并输出 CSV 文件的 PowerShell 脚本。在 SQLCMD 命令中,我想将一个参数传回给包含逗号分隔列表值的查询,以便我可以在“IN”语句中使用。

select a, b, c, d
from dbtbl (nolock)
where client_id in ($(clients))

如果我将 $client_id 分配给奇异值(即 '000_abc'),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 查询 where 参数用于带有 IN 语句的 where 子句。

标签: sqlvariablespowershell-2.0sqlcmd

解决方案


你为什么使用sqlcmd.exe而不是Invoke-SqlCmdor,更好的是,Invoke-SqlCmd2

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

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

让我知道是否有充分的理由不使用Invoke-SqlCmd2,我会看看我能做些什么来为你模拟这个,但这对我来说是一项不平凡的努力,所以我鼓励你遵循正常的做法!


推荐阅读