我试图从我的表数据生成xml。列名称之一具有&
(非法字符)。因此,在生成xml时出现以下错误。
消息6850,级别16,状态1,行955列名“a&b”包含一个
FOR XML要求的无效XML标识符; '&'(0x0026)是
错误的第一个字符。
这是一个例子
SELECT [a&b] ='A'
FOR xml path(''), root('head')
预期结果 :
<head>
<a&b>A</a&b>
</head>
有办法在sql中做到这一点吗?
最佳答案
您的预期结果肯定是无效的xml:
XML是一种可互换的格式,可以转换为(半)人类可读的字符串格式。将XML编码为字符串的需求必须将某些字符定义为魔术,即<, > and &
。为了避免干扰XML的标记,必须将这些字符转义为:
DECLARE @tbl TABLE([ab] NVARCHAR(100));
INSERT INTO @tbl VALUES(N'forbidden characters will be escaped &><');
SELECT * FROM @tbl FOR XML PATH('root');
结果
<root>
<ab>forbidden characters will be escaped &><</ab>
</root>
适当的工具将在读取XML时自动重新转义这些实体。
但是元素和属性的节点受到更多限制!该表包含一个错误的列:
DECLARE @tbl2 TABLE([a&b] NVARCHAR(100));
INSERT INTO @tbl2 VALUES(N'dummy');
SELECT * FROM @tbl2 FOR XML RAW;
FOR XML PATH
将引发错误,但是FOR XML RAW
将返回以下内容:<row a_x0026_b="dummy" />
问题是,这些替换没有重新编码为:
DECLARE @xml XML=(SELECT * FROM @tbl2 FOR XML RAW);
SELECT @xml.value(N'local-name((/row/@*)[1])',N'nvarchar(max)')
该属性的名称以
a_x0026_b
的形式返回。我的第一个建议是:绝对不要这样做!不要在XML的标记中使用禁止的字符!
您可能会使用类似
SELECT column1
,column2
,[My&bad<column] AS SomeOtherName
,column4
FROM myTable
FOR XML PATH('root')
关于sql - 如何在标签中生成带有非法字符的xml,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46583337/