我已经和这个人争斗了好几天了,我正在寻找使用以下语法自动化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
答案 0 :(得分:7)
将此<?xml version="1.0" encoding="windows-1252" ?>
与您的XML连接,转换为varchar(max)。
我同意j0N45架构不会改变任何内容。正如the answer he references所指出的那样:
您必须手动添加。
我在another answer中提供了一些示例代码。基本上,您将CONVERT
XML转换为varchar
或nvarchar
,然后将其与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。
我不认为创建架构会改变任何东西,因为它只用于验证。
干杯