Вы не говорите, какой метод используете для выполнения команд SQL в своем вопросе. Возможно, есть более упрощенный способ сделать это, но я решил эту проблему в Jenkins, а затем перенес решение в задачу Azure DevOps Command Line со следующим кодом на агенте сборки Windows. EXEC tSQLt.RunAll
выполнялся на предыдущем шаге:
::export the test results to a file
bcp "EXEC [tSQLt].[XmlResultFormatter];" queryout %WORKSPACE%\test_results.xml -S %DBSERVER% -d %DBNAME% -T -w
::remove the carriage returns (added by BCP every 2048 chars) from the xml file
::and write to a new file
PowerShell -ExecutionPolicy Bypass -NoProfile -Command "& {(gc %WORKSPACE%\test_results.xml -Raw).replace([Environment]::NewLine , '') | Set-Content %WORKSPACE%\output_test_results.xml}"
Надеемся, что комментарии объясняют, что происходит.
Задача командной строки имеет следующие переменные среды:
DBSERVER
- имя сервера базы данных DBNAME
- имя тестируемой базы данных WORKSPACE
- $(build.sourcesDirectory)
- это наследие выполнение сценария в Jenkins и может быть учтено
Файл, выводимый второй командой output_test_results.xml
, передается в задачу Publi sh Результаты теста позже в сборке.
РЕДАКТИРОВАТЬ
Я посмотрел на это, и я думаю, что понимаю, что происходит. Хотя SSMS представляет результат XML в виде одного столбца / строки, данные фактически возвращаются клиенту в виде последовательности более коротких строк (<2048 символов). </p>
Поведение по умолчанию Invoke-Sqlcmd
заключается в возвращать результаты в виде массива DataRow
объектов - каждый элемент в массиве содержит от 2000 до 2048 символов. Этот массив необходимо объединить вместе, чтобы сгенерировать набор результатов - вот один из способов сделать это в PowerShell:
$out = ""; Invoke-SqlCmd -ServerInstance <server> -Database <db name> -Query "exec tSQLt.XmlResultFormatter" -MaxCharLength 1000000 | %{ $out = $out + $_[0]}; $out > c:\temp\output.txt
На мой оригинальный ответ также влияет эта проблема - отсюда и команда PowerShell для удаления возврата каретки каждые 2048 символов.