sqlcmd 和/或 PowerShell 包装 XML 输出

Dav*_*vid 5 xml sql-server powershell

我正在执行以下命令:

sqlcmd -i "\\path\to\sqlfile.sql" -S "ServerName" -d "DBName" -y 0
Run Code Online (Sandbox Code Playgroud)

其中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
Run Code Online (Sandbox Code Playgroud)

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

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

<SomeTag>This is some content just to illustrate.</Som
eTag>
Run Code Online (Sandbox Code Playgroud)

我试过-wsqlcmd论点上使用。在测试中,如果值低于 2,033,但在任何高于 2,033 的值(20000例如,这将足够宽)时将成功换行,则将保持相同的最大值 2,033。

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

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

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

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

有什么我可以在这里添加/修改的东西来突破 2,033 个字符的宽度限制吗?或者也许是一种更具创造性的方法来实现相同的目标?

Dav*_*vid 4

跟进另一个答案...

(注意:在这种情况下,我必须专门针对 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))
Run Code Online (Sandbox Code Playgroud)

然后简单地调用为:

sqlcmd -i "\\path\to\sqlcode.sql" -S "ServerName" -d "DBName" -o "C:\path\to\output.xml" -y0
Run Code Online (Sandbox Code Playgroud)

结果是输出文件中的一行 XML。(稍后我可以漂亮地打印它。)