sql - 如何通过 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 子句。
解决方案
你为什么使用sqlcmd.exe
而不是Invoke-SqlCmd
or,更好的是,Invoke-SqlCmd2
?
快速上下文:是一个解决一些问题
Invoke-SqlCmd2
的社区替代品。Invoke-SqlCmd
它被广泛认为是从 PS 查询 MS SQL 的最佳解决方案。相关:Install-Module Invoke-SqlCmd2
,https ://github.com/sqlcollaborative/Invoke-SqlCmd2
正如您所发现的,将参数传递给本机应用程序非常困难。根据我的经验,尽可能使用 PS 命令总是更好。
让我知道是否有充分的理由不使用Invoke-SqlCmd2
,我会看看我能做些什么来为你模拟这个,但这对我来说是一项不平凡的努力,所以我鼓励你遵循正常的做法!
推荐阅读
- cordite - 通过 Braid 传递 List 对象
- ruby-on-rails - 如何在 perform 方法中使用 Sidekiq 的时间戳参数?
- typo3 - Typo3 8.7.10 可切换控制器操作不起作用
- python - Converting hexadecimal to decimal using dictionaries
- swift - fileManger 返回错误我无权查看包中的文件
- python - Printing a class attribute
- canonical-link - Why am i getting this error? Return tag error (page does not link back)
- c# - Downloading files to Azure function app to manipulate
- x86 - 已提交与已退休指令
- node.js - Node.js Testing with Mongoose. unique gets ignored