【发布时间】: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