【问题标题】:Invoke-SqlCmd doesn't return long string?Invoke-SqlCmd 不返回长字符串?
【发布时间】:2015-04-07 03:05:13
【问题描述】:

如下代码

$sql = "select ..... for xml path('row')" # returns a long xml file
$x = Invoke-SqlCmd -Server xxxx $sql
$r = $x[0].ItemArray[0]

返回的$r 有一个截断的 xml 字符串。如何确保返回完整的长字符串?

【问题讨论】:

    标签: sql-server powershell


    【解决方案1】:

    该 cmdlet 具有默认的最大字符长度,对于 XML 或 char 数据类型,默认为 4,000 个字符(请参阅Search for -MaxCharLength)。

    尝试以下方法:

    $x = Invoke-SqlCmd -Server xxxx $sql -MaxCharLength <some large enough number>
    

    【讨论】:

    • 其实我发现结果被分成了多行。
    • @dc7a9163d9 从我所做的一些快速测试中我发现这也是正确的。但是,重建 xml 文档应该很容易。再把矮胖子放在一起就好了。 ;) 也就是说,我还发现,如果您发现您的查询为单列 char 数据返回超过 4000 个数组元素(二进制为 1024;使用-MaxBinaryLength),那么您将需要上面的命令来确保你得到了整个文件。
    • 诚然,虽然我的测试只是使用我已经在某个数据库中的二进制数据。我没有对 xml 或其他 char 数据进行任何测试。我不知道powershell如何将它们分块。对我来说,它看起来像是按字节切割它们。也许对于 xml 文档,它会按行执行。必须测试它。
    • 这个答案为我解决了这个问题,没有将数据分成多行。我成功读取了超过 80,000 字节的字符串。
    • 谢谢。事实上这是必要的,这表明 powershell 是多么破碎,双重地,因此解决方案需要涉及 而不是他们提供类似 -NoTruncate 的东西
    【解决方案2】:

    很多时候这解决了这个问题:

    $x = Invoke-SqlCmd -Server xxxx $sql -MaxCharLength <some large enough number>
    

    但是,在某些情况下它不起作用:

    • 在 80,000 到 3,500,000 个字符之间的某个地方,此解决方案似乎无法解决问题。
    • 我得到的结果是乱码:内部 XML 破坏了外部 XML,所以很明显,至少我们的版本也存在一些缺陷。

    您可以尝试几种解决方案:

    • 将内容限制为 x 个字符,例如 80,000,并且不要尝试导出超过此值的任何内容。我没有测试这是否也能解决缺陷案例,所以如果其他人有这个问题,请评论是否有帮助。
    • 我将所有内容导出为 CSV,破坏了内部 XML,创建了临时 XML 结果,最后再次修复了内部 XML。这个解决方案奏效了。在处理几乎 1 GB 大小的文件以提高性能时,必须使用带有文件读取功能的选项“-raw”。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-04-08
      • 2015-07-06
      • 2020-04-30
      • 2019-07-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多