Выбрать (или разделить) столбец из вывода SQLCMD
Как выбрать столбцы из SQLCMD
вывод в PowerShell v1? Я пытаюсь сделать вывод JSON используя Write-Output
в PowerShell v1.
Вывод запроса в конце.
$_
возвращает оба столбца. Если бы только мы могли использовать $_.name
а также $_.jobid
, но они оба возвращают пустые строки. Исправление это было бы предпочтительным решением.
Вот команда PowerShell:
Write-Output '{"data":[';
(SQLCMD -S 'x.x.x.x' -U 'user' -P 'passwors' -i "C:\query.sql" -W) | %{
try {
($coma + '{"{#JOBID}":"' + $_ + '",' + '"{#JOBNAME}":"' + $_ + '"}');
$coma=',';
} catch {}
};
Write-Output "]}"
Что это возвращает:
{"data":[
,{"{#JOBID}":"12345-aaaa-1234-5678-000000000000000 Clear DB entries","{#JOBNAME}":"12345-aaaa-1234-5678-000000000000000 Clear DB entries"}
,{"{#JOBID}":"12345-bbbb-1234-5678-000000000000000 TempLog DB","{#JOBNAME}":"12345-bbbb-1234-5678-000000000000000 TempLog DB"}
]}
Что я ожидаю:
{"data":[
,{"{#JOBID}":"12345-aaaa-1234-5678-000000000000000","{#JOBNAME}":"Clear DB entries"}
,{"{#JOBID}":"12345-bbbb-1234-5678-000000000000000","{#JOBNAME}":"TempLog DB"}
]}
Я не уверен, как использовать разделение с разделителем табуляции ($_ -split "
т ") для обоих job_id
а также name
, Мои попытки либо возвращали оба имени столбца как одно, а в некоторых случаях возвращались пустыми.
Вот запрос и его вывод в командной строке:
PS C: \> SQLCMD -S 'xxxx' -U 'пользователь' -P 'пароль' -i "C:\query.sql" -W название вакансии 12345-aaaa-1234-5678-000000000000000 Очистить записи в БД 12345-bbbb-1234-5678-000000000000000 БД TempLog (Затронуто 2 ряда)
Я знаю о ConvertTo-Json
в версии 3, но я хочу, чтобы он работал на PowerShell v1, чтобы он был полезен тем, кто не может выполнить обновление по какой-либо причине.
2 ответа
Другой метод, кажется надежным. Спасибо Бэкону Битсу ответ.
$coma=''; Write-Output '{"data":[';
(SQLCMD -S 'x.x.x.x' -U 'user' -P 'password' -i "C:\query.sql" -W -m 1 -s `"`t`") | ConvertFrom-Csv -Delimiter "`t" | Select-Object -Skip 1 | %{
try {
($coma + '{"{#JOBID}":"' + $_.job_id + '",' + '"{#JOBNAME}":"' + $_.name + '"}');
$coma=',';
} catch {}
};
Write-Output "]}"
Если ваши данные содержат вкладки, вам понадобится другой разделитель. Select-Object -Skip 1 предназначен для пропуска строки подчеркивания, которую sqlcmd всегда создает под заголовком.
Также помните, что вы должны использовать параметр -w в sqlcmd, чтобы предотвратить любую неправильную перенос. Также помните, что нулевые значения всегда выводятся в виде буквенной строки NULL.
Снова Powershell v3
или же Invoke-SQLcmd
рекомендуется по этому методу.
Обходной путь, который я придумал, заключается в использовании ($_ -split ' ')[1..100]
для второго столбца #JOBNAME
а также ($_ -split ' ')[0]
для первого столбца #JOBID
,
Примечание: это работает только потому, что JOBID
Значения столбца выражены как одно слово. Это не работает для других запросов, если в первом столбце есть случайное количество слов.
Вот последняя команда и вывод:
$coma=''; Write-Output '{"data":[';
(SQLCMD -S 'x.x.x.x' -U 'user' -P 'passwors' -i "C:\query.sql" -W) | %{
try {
($coma + '{"{#JOBID}":"' + ($_ -split ' ')[0] + '",' + '"{#JOBNAME}":"' + ($_ -split ' ')[1..100] + '"}');
$coma=',';
} catch {}
};
Write-Output "]}"
Выход:
{"data":[
,{"{#JOBID}":"12345-aaaa-1234-5678-000000000000000","{#JOBNAME}":"Clear DB entries"}
,{"{#JOBID}":"12345-bbbb-1234-5678-000000000000000","{#JOBNAME}":"TempLog DB"}
]}
Существует также метод Invoke-SQLcmd, но для добавления оснастки требуется 30 секунд, а для выполнения запроса - 2 секунды.
Add-PSSnapin SqlServerCmdletSnapin100; $coma=''; Write-Output '{"data":[';
(Invoke-Sqlcmd -ServerInstance 'x.x.x.x' -username 'user' -password 'password' -inputfile "C:\query.sql") | %{
try {
($coma + '{"{#JOBID}":"' + $_.job_id + '",' + '"{#JOBNAME}":"' + $_.name + '"}');
$coma=',';
} catch {}
};
Write-Output "]}"
Если у вас есть Powershell v3
тогда вы могли бы просто использовать Sqlcmd... | ConvertTO-Json