首页 > 解决方案 > tSQLt.XmlResultFormatter 在 2033 个字符后截断结果

问题描述

尝试使用 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 格式的结果吗?

谢谢你的时间

标签: tsqlt

解决方案


你没有说你使用什么方法来执行你的问题中的 SQL 命令。可能有一种更简化的方法来执行此操作,但我在 Jenkins 中解决了这个问题,然后在 Windows 构建代理上使用以下代码将该解决方案移植到 Azure DevOps命令行任务。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传递给构建稍后的发布测试结果任务。

编辑

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

的默认行为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 个字符返回一次。


推荐阅读