tsqlt - 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 格式的结果吗?
谢谢你的时间
解决方案
你没有说你使用什么方法来执行你的问题中的 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 个字符返回一次。
推荐阅读
- powershell - 用于静默安装 Azure Service Fabric SDK、运行时和工具的 Powershell 脚本
- javascript - innerHTML 不适用于 IE
- reactjs - 用 Jest 手动模拟——我不明白
- java - Java MySQL 执行更新 SQLSyntaxErrorException
- java - 使用 Geotools 创建楔形
- powershell - Powershell - 关于 Get-AdUser 的基本脚本不起作用
- android - android升级到sdk 27黑屏没有错误
- r - R -> `row.names<-.data.frame` 中的错误
- laravel - 媒体查找器在前端显示图像
- groovy - Groovy 脚本设置带有时间戳的标头