什么是:XML ON in T-SQL query to export data into XML using SQLCMD?

问题描述 投票:0回答:2

在这篇关于使用 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 不识别代码行?

xml tsql bcp sqlcmd sql-server-2008
2个回答
5
投票

在此 MSDN 页面中进行了解释(搜索“:XML”):sqlcmd Utility

那一页说:

XML 输出是 FOR XML 子句的结果, 未格式化,连续不断。

当您期望 XML 输出时,请使用以下命令::XML ON.

注意
sqlcmd 以通常的格式返回错误消息。请注意 错误消息也以 XML 格式输出到 XML 文本流中 格式。通过使用 :XML ONsqlcmd 不显示信息 消息。

要关闭 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.

这很可能是由于在查询编辑器的上下文中不需要此特定命令。


0
投票

实际上您可以使用 SQLCMD 导出 XML:

  1. 创建生成XML的脚本:

    SET @sqlSelect = ':XML ON '+@NewLineChar+';WITH Header AS (  SELECT ( SELECT '''+@contactPerson+''' ContactPerson FOR XML PATH('''')...
    

    在这里,添加

    :XML ON
    然后
    NewLineCHAR (CHAR(13)+ CHAR(10))

  2. ''
    变为
    ''''

    SET @sqlSelect= REPLACE(@sqlSelect,'''','''''')
    
  3. Create a temp table with a single field as

    VARCHAR (2000)
    and insert into this field your new string (
    @sqlSelect
    )

  4. 使用您插入临时表的内容在光盘上创建一个临时文件:

    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
    
  5. 使用此 SQL 文件创建 XML:

    SET @commandline = 'sqlcmd  -i tempfile.sql -o ResultFile.XML 
    EXEC @result = master..xp_cmdshell @commandline
    
© www.soinside.com 2019 - 2024. All rights reserved.