尝试使用tSQLt将我的tSQLt.XmlResultFormatter测试结果导出到tSQLt.XmlResultFormatter。但它似乎在2033个字符之后截断了输出,
BEGIN TRY EXEC tSQLt.RunAll END TRY BEGIN CATCH END CATCH; EXEC tSQLt.XmlResultFormatter我想要xml的输出,这样我就可以在Microsoft部署管道中引用它。我现在只有14次测试,感觉不像很多。如果这是XmlResultFormatter的限制,是否有其他方法以xml格式获得结果?
耽误您时间,实在对不起
发布于 2020-01-21 09:34:08
您不需要说明使用什么方法来执行问题中的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 --数据库服务器nameDBNAME -- testWORKSPACE - $(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个字符返回一次。
https://stackoverflow.com/questions/59785173
复制相似问题