我试图从我的表数据中生成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中执行此操作?
答案 0 :(得分:3)
也许您可以更改为XML raw:
SELECT [a&b] ='A'
FOR xml raw, root('head')
这将改变XML的结构,但它不会引发错误,而且它是格式良好的XML。
<head>
<row a_x0026_b="A" />
</head>
答案 1 :(得分:2)
您可以使用特殊字符串执行REPLACE
,该字符串不会出现在XML数据中:
DECLARE @myXML varchar(MAX)
SET @myXML=(SELECT 'a.123ASPECIALSTRING123.b'='A' FOR xml path(''), root('head'))
SELECT REPLACE(@myXML, '.123ASPECIALSTRING123.', '&');
测试示例:http://rextester.com/BYJYY1222
但请注意:&
不是XML元素名称的允许字符。
意味着结果将是一个格式错误的XML。
XML元素必须遵循以下命名规则:
- 元素名称区分大小写
- 元素名称必须以字母或下划线开头
- 元素名称不能以字母xml(或XML,或Xml等)
开头- 元素名称可以包含字母,数字,连字符,下划线和句点
- 元素名称不能包含空格
可以使用任何名称,不保留任何单词(xml除外)。
答案 2 :(得分:2)
您的预期结果肯定是无效的xml:
XML应该是一种可互换的格式,可以转换为(半) - 人类可读字符串格式。将XML编码为字符串的必要性必须将某些字符定义为 magic ,即<, > 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')