【问题标题】:adding encoding information to the result of FOR XML [duplicate]将编码信息添加到 FOR XML 的结果 [重复]
【发布时间】:2011-09-07 02:07:40
【问题描述】:

我有一个脚本,它在 SQL 2008 中使用 FOR XML 返回一个 XML。有没有办法在输出的开头添加版本和编码信息。最后,我打算将输出保存在一个文件中。

例如,现在我的输出看起来像这样

<Agents>
  <Agent id="1">
    <Name>Mike</Name>
    <Location>Sanfrancisco</Location>
  </Agent>
  <Agent id="2">
    <Name>John</Name>
    <Location>NY</Location>
  </Agent>
</Agents>

我想在 Xml 输出的开头附加行 &lt;?xml version="1.0" encoding="UTF-8"?&gt;

所以我想要输出类似于

<?xml version="1.0" encoding="UTF-8"?>
<Agents>
 <Agent id="1">
   <Name>Mike</Name>
   <Location>Sanfrancisco</Location>
 </Agent>
<Agent id="2">
  <Name>John</Name>
  <Location>NY</Location>
</Agent>

【问题讨论】:

    标签: sql sql-server-2008


    【解决方案1】:

    正如@gbn 在another answeranother question 中指出的那样,“the XML data is stored internally as ucs-2”,SQL Server 在生成数据时不包括它。但是,您可以将 XML 转换为字符串并手动在开头附加 XML 声明。但是,仅在声明中使用 UTF-8 是不准确的。 SQL 产生的 Unicode 字符串在 UCS-2 中。例如,这将失败:

    SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UTF-8"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));
    

    有错误:

    Msg 9402,级别 16,状态 1,第 1 行 XML 解析:第 1 行,字符 38, 无法切换编码

    另一方面,这将按预期工作:

    SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UCS-2"?>' + CONVERT(NVARCHAR(MAX),CONVERT(XML,N'<x>' + NCHAR(10176) + N'</x>')));
    

    以下代码将生成您为示例数据寻找的完整的、包含声明的 XML 字符串:

    DECLARE @Agents TABLE
    (
        AgentID int,
        AgentName nvarchar(50),
        AgentLocation nvarchar(100)
    );
    INSERT INTO @Agents (AgentID, AgentName, AgentLocation) VALUES (1, N'Mike', N'Sanfrancisco');
    INSERT INTO @Agents (AgentID, AgentName, AgentLocation) VALUES (2, N'John', N'NY');
    
    WITH BaseData AS
    (
        SELECT
            (
                SELECT
                    AgentID AS '@id',
                    AgentName AS 'Name',
                    AgentLocation AS 'Location'
                FROM    @Agents
                FOR     XML PATH('Agent'), ROOT('Agents'), TYPE
            ) AS AgentXML
    ), FullStringTable AS
    (
        SELECT
            *,
            '<?xml version="1.0" encoding="UCS-2"?>' +
            CONVERT(nvarchar(max),AgentXML) AS FullString
        FROM        BaseData
    )
    SELECT
        AgentXML AS OriginalXML,
        FullString,
        CONVERT(xml,FullString) AS FullStringConvertedToXML
    FROM        FullStringTable;
    

    【讨论】:

      【解决方案2】:

      SQL Server 内部始终使用 utf-16 ucs-2,因此您可以像我们一样添加它。也就是说,SQL Server 永远不会使用“utf-8”生成任何内容。

      编辑:经过一番挖掘:

      【讨论】:

        【解决方案3】:

        如果您不会尝试将结果作为 TSQL XML 进行操作,那么最简单的做法是使用您希望附加的字符串创建一个 varchar,然后使用 CAST 语句将 XML 添加到其中以将 XML 转换为 varchar .

        declare @testXML as XML
        declare @testPrefix as varchar(255)
        set @testPrefix = '<?xml version="1.0" encoding="UTF-8"?>'
        set @testXML = '<Agents>  <Agent id="1">    <Name>Mike</Name>    <Location>Sanfrancisco</Location>  </Agent>  <Agent id="2">    <Name>John</Name>    <Location>NY</Location>  </Agent></Agents>'
        
        select @testPrefix
        Select @testXML
        select @testPrefix + CAST(@testXML as varchar(max)) 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-09-24
          • 1970-01-01
          • 2021-11-06
          • 2018-12-12
          • 1970-01-01
          • 2013-05-16
          • 1970-01-01
          相关资源
          最近更新 更多