【问题标题】:sqlcmd and/or PowerShell wrapping XML outputsqlcmd 和/或 PowerShell 包装 XML 输出
【发布时间】:2017-08-05 04:44:34
【问题描述】:

我正在执行以下命令:

sqlcmd -i "\\path\to\sqlfile.sql" -S "ServerName" -d "DBName" -y 0

其中sqlfile.sql 是一些用于变量的DECLARE 语句,然后是嵌套的SELECT ... FOR XML Path('...') 语句树,最终生成一个大的XML 字符串作为输出。

在 PowerShell 命令提示符中,我将输出通过管道传输到文件:

sqlcmd -i "\\path\to\sqlfile.sql" -S "ServerName" -d "DBName" -y 0 | Out-File C:\path\to\output.xml

(或者我可以在命令本身上使用-o,这两种方式我都没有强烈的偏好。)

这里的目标是拥有一个 XML 文件,然后可以将其加载到另一个下游流程中。这很好用,除了一个目前让我卡住的细节。输出(到文件)自动换行为 2,033 个字符。这意味着如果(在大多数情况下)包装破坏了标签,它会生成损坏的 XML:

<SomeTag>This is some content just to illustrate.</Som
eTag>

我尝试在 sqlcmd 参数上使用 -w。在测试中,如果值低于 2,033,但在任何高于 2,033 的值(例如20000,这将是足够宽),将保持相同的最大值 2,033。

我还尝试在管道输出之前调用-replace 以尝试删除换行符,例如:

([the sqlcmd command above]) -replace "\r", "" | Out-File C:\path\to\output.xml

包括对\r\n\r\n 的尝试,并使用反引号而不是反斜杠。一切都无济于事。 (在测试中,-replace "KnownString", "TEST" 确实成功地将已知字符串替换为TEST。)

也许隧道视觉已经接管了这里。我错过了一些更容易的东西吗?目标是拥有一个 PowerShell 命令行命令,该命令执行 .sql 文件并将有效的 XML(不需要漂亮打印,虽然这很酷)放入 .xml 文件。

我可以在此处添加/修改哪些内容可以突破 2,033 个字符的宽度限制?或者也许是一种更有创意的方法来实现相同的目标?

【问题讨论】:

  • 试过-repalce '\r|\n' 让它处理换行/回车的任一顺序?您还可以使用旧版本的 sqlcmd,在 poweshell 或 cmdlet (stackoverflow.com/questions/10894688/…) 中使用本机 SqlClient-classes 来读取数据。该行为似乎是 sql 2012 中的一个已知错误,请参阅解决方法链接connect.microsoft.com/SQLServer/feedback/details/786004/…
  • @FrodeF.:看起来这些变通方法的组合正在奏效。具体来说,将SELECT 包装在XML 类型变量中,然后将该变量选择为NVARCHAR(MAX)。适用于sqlcmd,无需字符替换。随意添加作为答案,谢谢!

标签: sql-server xml powershell


【解决方案1】:

跟进the other answer...

(注意:在这种情况下,我必须保持特定于 SQL 2012。它是客户拥有的工作站,他们有自己的规则。)

我将.sql 文件包装在以下内容中:

SET NOCOUNT ON
DECLARE @XML AS XML

SET @XML = ([the great big set of nested selects generating xml])

SELECT CAST(@XML AS NVARCHAR(MAX))

然后简单地调用为:

sqlcmd -i "\\path\to\sqlcode.sql" -S "ServerName" -d "DBName" -o "C:\path\to\output.xml" -y0

结果是输出文件中的单行 XML。 (我可以把它打印出来以备不时之需。)

【讨论】:

    【解决方案2】:

    一些建议:

    • 尝试-replace '\r|\n' 让它处理换行/回车的任一顺序

    • 您也可以使用旧版本的sqlcmd,使用powershell 中的本机SqlClient 类或SQL-server 模块来读取数据(例如How to execute .sql file using powershell?)。

    该行为似乎是 sqlcmd 2012 中的一个已知错误,请参阅有关连接的错误报告以了解其他解决方法:https://connect.microsoft.com/SQLServer/feedback/details/786004/

    【讨论】:

      【解决方案3】:

      我在将 SQL 查询导出为 JSON 时遇到了类似的问题。每 2033 个字符,输出将使用 sqlcmd 或 Invoke-SQLcmd 开始一个新行。将输出设置为 nvarchar 会强制将内容放在一行中。

      SET NOCOUNT ON
      DECLARE @JSONOUTPUT AS NVARCHAR(MAX)
      
      SET @JSONOUTPUT = ([SELECT * .....])
      
      SELECT @JSONOUTPUT
      

      我使用 Invoke-SQLcmd $sqlquery -maxcharlength 10000 | select -expandproperty Column1 调用它,但也可以使用 cmdsql 来完成。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-12-17
        • 2016-01-15
        • 2019-06-21
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多