tSQLt.XmlResultFormatter 在 2033 个字符后截断结果

tSQLt.XmlResultFormatter truncates results after 2033 chars

正在尝试使用 tSQLt.XmlResultFormatter 将我的 tSQLt 测试结果导出到 XML。 但它似乎在 2033 个字符后截断了输出,

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

我希望在 xml 中输出,以便我可以在 Microsoft Devops CI 部署管道中引用它。目前我只有 14 个测试,感觉并不多。如果这是 XmlResultFormatter 的限制,是否有另一种方法以 xml 格式获取结果?

感谢您的宝贵时间

您没有说您使用什么方法来执行问题中的 SQL 命令。可能有一种更简化的方法,但我在 Jenkins 中解决了这个问题,然后使用以下代码将解决方案移植到 Azure DevOps 命令行 任务,在 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 中 运行 脚本的遗留问题,可以提取出来[=44​​=]

第二个命令 output_test_results.xml 的文件输出被传递给稍后构建中的 发布测试结果 任务。

编辑

我调查了这个,我想我明白发生了什么。尽管 SSMS 将 XML 结果显示为单个 column/row,但数据实际上是 return 作为较短行序列(<2048 个字符)发送给客户端的。

Invoke-Sqlcmd 的默认行为是 return 结果作为 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 个字符删除回车 returns。