SQL Server 2008 - 将XML声明添加到XML输出

时间:2010-11-15 12:09:24

标签: sql-server xml encoding

我已经和这个人争斗了好几天了,我正在寻找使用以下语法自动化XML输出

 SELECT (
   SELECT CONVERT(VARCHAR(10),GETDATE(),103)
   FOR XML PATH('DataVersion'), 
     TYPE
   ),
   (  
   SELECT CoNum,
     CoName,
     CONVERT(VARCHAR(10),AccountToDate,103) 'DLA',
     LAFileNet
   FROM @XMLOutput  
   FOR XML PATH('Company'),
     TYPE  
   )
 FOR XML PATH(''),
   ROOT('Companies')

创建以下输出

<Companies>
  <DataVersion>15/11/2010</DataVersion>
  <Company>
    <CoNum>111</CoNum>
    <CoName>ABCLmt</CoName>
    <DLA>12/12/2010</DLA>
    <LAFileNet>1234</LAFileNet>
  </Company>
  <Company>
    <CoNum>222</CoNum>
    <CoName>DEFLmt</CoName>
    <DLA>12/12/2007</DLA>
    <LAFileNet>5678</LAFileNet>
  </Company>
</Companies>

我正在努力解决的问题是如何将XML声明<?xml version="1.0" encoding="ISO-8859-1" ?>添加到输出的顶部?

更新1:我认为我需要在SQL服务器中创建XML模式来定义xsl:output是否正确?然后将输出分配给该架构?

更新2:此后发现了这些链接 http://forums.asp.net/t/1455808.aspx - 查看健康的评论。也 http://www.devnewsgroups.net/group/microsoft.public.sqlserver.xml/topic60022.aspx

2 个答案:

答案 0 :(得分:7)

TL; DR

将此<?xml version="1.0" encoding="windows-1252" ?>与您的XML连接,转换为varchar(max)。

详细

我同意j0N45架构不会改变任何内容。正如the answer he references所指出的那样:

  

您必须手动添加。

我在another answer中提供了一些示例代码。基本上,您将CONVERT XML转换为varcharnvarchar,然后将其与XML声明连接,例如<?xml version="1.0" encoding="windows-1252" ?>

但是,选择正确的编码很重要。 SQL Server根据其排序规则设置生成非Unicode字符串。默认情况下,这将由数据库排序规则设置控制,您可以使用此SQL确定:

SELECT DATABASEPROPERTYEX('ExampleDatabaseName', 'Collation');

A common default collation是&#34; SQL_Latin1_General_CP1_CI_AS&#34;,其代码页为1252.您可以使用此SQL检索代码页:

SELECT COLLATIONPROPERTY('SQL_Latin1_General_CP1_CI_AS', 'CodePage') AS 'CodePage';

对于代码页1252,您应使用&#34; windows-1252&#34;的编码名称。使用&#34; ISO-8859-1&#34;是不准确的。您可以使用&#34; bullet&#34;来测试它。性格:•。它的Unicode Code Point值为8226(Hex 2022)。无论排序规则如何,您都可以使用以下代码可靠地生成SQL中的字符:

SELECT NCHAR(8226);

它在windows-1252代码页中的代码点为149,因此如果您使用&#34; SQL_Latin1_General_CP1_CI_AS&#34;的常见默认排序规则,那么您也可以使用以下方法生成它:< / p>

SELECT CHAR(149);

然而,CHAR(149)并不是所有整理中的子弹。例如,如果您尝试这样做:

SELECT CONVERT(char(1),char(149)) COLLATE Chinese_Hong_Kong_Stroke_90_BIN;

你根本没有得到子弹。

The "ISO-8859-1" code page is Windows-28591。 SQL Server排序规则(无论如何在2005年)都没有使用该代码页。您可以使用以下命令获取完整的代码页列表:

SELECT [Name], [Description], [CodePage] = COLLATIONPROPERTY([Name], 'CodePage')
FROM ::fn_helpcollations()
ORDER BY [CodePage] DESC;

您可以进一步验证&#34; ISO-8859-1&#34;尝试在SQL本身使用它是错误的选择。以下SQL:

SELECT CONVERT(xml,'<?xml version="1.0" encoding="ISO-8859-1"?><test>•</test>');

将生成不包含项目符号的XML。实际上,它不会产生任何字符,因为ISO-8859-1没有为代码点149定义字符。

SQL Server以不同方式处理Unicode字符串。使用Unicode字符串(nvarchar),"there is no need for different code pages to handle different sets of characters"。但是,SQL Server不使用&#34; UTF-8&#34;编码。如果您尝试在SQL本身中使用它:

SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UTF-8"?><test>•</test>');

您将收到错误消息:

  

Msg 9402,Level 16,State 1,Line 1 XML解析:第1行,第38个字符,   无法切换编码

相反,SQL使用&#34; UCS-2&#34;编码,所以这将工作:

SELECT CONVERT(xml,N'<?xml version="1.0" encoding="UCS-2"?><test>•</test>');

答案 1 :(得分:1)

我认为这回答了您的问题How to add xml encoding <?xml version="1.0" encoding="UTF-8"?> to xml Output in SQL Server

我不认为创建架构会改变任何东西,因为它只用于验证。

干杯