【问题标题】:tSQLt.XmlResultFormatter truncates results after 2033 charstSQLt.XmlResultFormatter 在 2033 个字符后截断结果
【发布时间】:2020-01-17 10:07:30
【问题描述】:

尝试使用 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


    【解决方案1】:

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

    希望 cmets 解释发生了什么。

    命令行任务定义了以下环境变量:

    • DBSERVER - 数据库服务器名称
    • DBNAME - 被测数据库的名称
    • WORKSPACE - $(build.sourcesDirectory) - 这是在 Jenkins 中运行脚本的遗留问题,可以排除

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

    编辑

    我对此进行了调查,我想我明白发生了什么。尽管 SSMS 将 XML 结果显示为单个列/行,但数据实际上以较短的行序列(

    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 个字符返回一次。

    【讨论】:

    • 我发现 tSQLt.XmlResultFormatter 的输出限制为 2k 个字符。这会改变吗?为了解决这个问题,我制作了一个 powershell 脚本,它遍历不同的 tsqt 类并单独运行它们
    • @Jim - 这种方法没有这个限制。我的一个数据库使用这种方法生成了一个超过 290kb 的结果文件
    • @Jim - 您使用什么方法运行 tSQLt.XmlResultFormatter 发现字符数有限制?
    • 如果我在本地 MSSMS 上运行它,或者如果我在 devops 中使用 power shell 脚本连接到 db 并执行它返回相同的截断结果的 sql
    • 太好了,我稍微改变了它以添加凭据并调用全部运行,见下文,但非常感谢您的耐心等待。我会标记为正确的欢呼$out = ""; Invoke-SqlCmd -ServerInstance "xxxx" -Database "xxxx" -Query "exec tSQLt.Runall ; exec tSQLt.XmlResultFormatter" -Username "xxx" -Password "xxxx" -MaxCharLength 1000000 | %{ $out = $out + $_[0]}; $out &gt; C:temp/output.xml
    猜你喜欢
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2014-05-07
    • 2015-08-11
    • 2019-12-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多