在这篇关于使用 BCP 或 SQLCMD 使用 TSQL 将数据导出到 XML 的博客文章中,我遇到了这行代码:
:XML ON
SELECT
*
FROM
dbo02.ExcelTest
FOR XML AUTO, ELEMENTS, ROOT('doc')
我尝试在 sql 查询中使用它,然后在批处理文件中通过 sqlcmd 触发,它确实返回了正确的 xml 文件。如果没有
:XML ON
,它会返回网页上描述的奇怪值。
奇怪的是,SSMS (2008) 在解析或执行查询时显示不正确的语法。
:XML ON
是做什么用的?为什么 SSMS 不识别代码行?
在此 MSDN 页面中进行了解释(搜索“:XML”):sqlcmd Utility
那一页说:
XML 输出是 FOR XML 子句的结果, 未格式化,连续不断。
当您期望 XML 输出时,请使用以下命令::XML ON.
注意
sqlcmd 以通常的格式返回错误消息。请注意 错误消息也以 XML 格式输出到 XML 文本流中 格式。通过使用 :XML ON,sqlcmd 不显示信息 消息。要关闭 XML 模式,请使用以下命令::XML OFF。
围棋 命令不应出现在发出 XML OFF 命令之前,因为 XML OFF 命令将 sqlcmd 切换回面向行的输出。
XML (流式)数据和行集数据不能混合。如果 XML ON 命令 尚未在输出 XML 的 Transact-SQL 语句之前发出 streams 被执行,输出将是乱码。如果 XML ON 命令 已发出,您不能执行 Transact-SQL 语句 输出规则行集。
注意
:XML 命令不支持 SET STATISTICS XML 声明。
在 SSMS 中,即使启用“SQLCMD 模式”(在“查询”菜单中),尝试使用
:XML
命令时也会出现以下错误:
Scripting warning.
Command Xml is not supported. String was not processed.
这很可能是由于在查询编辑器的上下文中不需要此特定命令。
实际上您可以使用 SQLCMD 导出 XML:
创建生成XML的脚本:
SET @sqlSelect = ':XML ON '+@NewLineChar+';WITH Header AS ( SELECT ( SELECT '''+@contactPerson+''' ContactPerson FOR XML PATH('''')...
在这里,添加
:XML ON
然后NewLineCHAR (CHAR(13)+ CHAR(10))
将
''
变为''''
:
SET @sqlSelect= REPLACE(@sqlSelect,'''','''''')
Create a temp table with a single field as
VARCHAR (2000)
and insert into this field your new string (@sqlSelect
)
使用您插入临时表的内容在光盘上创建一个临时文件:
SET @commandline = 'sqlcmd -S . -E -h-1 -Q "SET NOCOUNT ON SELECT
CAST([field] as nvarchar(1500)) FROM [temptable]" -o "tempfile.sql" -w 1500 '
EXEC @result = master..xp_cmdshell @commandline
使用此 SQL 文件创建 XML:
SET @commandline = 'sqlcmd -i tempfile.sql -o ResultFile.XML
EXEC @result = master..xp_cmdshell @commandline