tSQLt.XmlResultFormatter усекает результаты после 2033 символов - PullRequest
0 голосов
/ 17 января 2020

Попытка экспортировать результаты моего теста tSQLt в XML с помощью tSQLt.XmlResultFormatter. Но похоже, что он усекает вывод после 2033 символов,

BEGIN TRY EXEC tSQLt.RunAll END TRY BEGIN CATCH END CATCH; EXEC tSQLt.XmlResultFormatter

Я хочу, чтобы вывод выводился в xml, чтобы я мог ссылаться на него в конвейере развертывания Microsoft Devops CI. У меня только 14 тестов на данный момент, что не так уж много. Если это предел XmlResultFormatter, есть ли другой способ получить результаты в формате xml?

Спасибо за ваше время

1 Ответ

1 голос
/ 21 января 2020

Вы не говорите, какой метод используете для выполнения команд 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 символов.

...