Выбрать (или разделить) столбец из вывода 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

Другие вопросы по тегам