Как передать массив как переменную в SQLCMD - PullRequest
0 голосов
/ 19 февраля 2019

Я пытаюсь передать имена серверов в сценарии SQL, но он не работает.Пожалуйста, помогите

SQL Script patch_report.sql, я работаю через powershell, выдавая ошибку

SELECT * from table where server in ('$(trimsqlstr)')

Ошибка

Msg 102,level Level 15, State 1, Server DBserver, Line 1
Incorrect syntax near 'server1'.
$DB_server = 'DBserver'
$serverName = "server1
server2
server3
"
$serverName = $serverName -split "\n" | foreach {$_.ToString().TrimEnd()}
$trimsqlstr = foreach($server in $serverName){
if ($serverName.Indexof($server) -eq $($serverName.Length-1)){
"'$Server'"
} else {
"'$Server',"
}

SQLCMD.exe -v trimsqlstr = "$($trimsqlstr)" -E -S $DB_server -W -i patch_report.sql

Я ожидаю, что это приведет кэто

SELECT * from table where server in ('server1','server2','server3')

Ответы [ 2 ]

0 голосов
/ 19 февраля 2019

Принятый ответ - отличное решение, я просто хочу указать вам на оператор -join.

Оператор -join очень удобен для объединения элементов массива в строку.

Вы можете сделать что-то вроде этого:

$serverNames = "server1
server2
server3
"

$serverNameArray = $serverNames -split "\n" | foreach {$_.ToString().TrimEnd()} | Where-Object {$_} | foreach {"'$_'"}
$whereClause = $serverNameArray -join ','
$selectQuery = "SELECT * from table where server in ($whereClause)"

Where-Object {$_} удаляет пустые элементы.

0 голосов
/ 19 февраля 2019

Вы можете использовать следующий код:

$DB_server = 'DBserver'
$serverName = "server1
server2
server3
"

$serverName = $serverName -split "\n" | foreach {$_.ToString().TrimEnd()}
ForEach($server in $serverName) 
{
$serverstring = $serverstring+"'"+$server+"'"+","
}
$trimsqlstr = $serverstring.Substring(0, $serverstring.Length-4)

И затем использовать $ trimsqlstr в запросе, как показано ниже

SELECT * from table where server in ($trimsqlstr)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...