Как добавить значение параметра через запятую, вызывая SQL-запрос, используя SQLCMD через Powershell - PullRequest
0 голосов
/ 12 июня 2019

Я пишу сценарий PowerShell, который вызывает SQLCMD для выполнения файла .sql и вывода файла CSV.В команде SQLCMD я хочу передать в запрос параметр, содержащий значение списка, разделенного запятыми, чтобы я мог использовать его в операторе 'IN'.

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

Команда SQLCMD работает, если я назначаю $client_id к единственному значению, то есть '000_abc', но не работает, если я назначаю переменную как массив.то есть '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.

1 Ответ

0 голосов
/ 13 июня 2019

Почему вы используете sqlcmd.exe вместо Invoke-SqlCmd или, что еще лучше, Invoke-SqlCmd2?

Быстрый контекст: Invoke-SqlCmd2 является заменой сообщества для Invoke-SqlCmd, которая решает несколько проблем. Это широко считается лучшим решением для запроса MS SQL из PS. Соответствующий: Install-Module Invoke-SqlCmd2, https://github.com/sqlcollaborative/Invoke-SqlCmd2

Как вы обнаружили, передача аргументов в нативные приложения на удивление трудна. По моему опыту, всегда лучше использовать команды PS, если это возможно.

Дайте мне знать, если есть веская причина не использовать Invoke-SqlCmd2, и я посмотрю, что я могу сделать, чтобы высмеивать это для вас, но это нетривиальное усилие с моей стороны, поэтому я призываю вас просто следуйте обычной практике!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...