gpt4 book ai didi

sql - 如何在标签中生成带有非法字符的xml

转载 作者:行者123 更新时间:2023-12-01 14:44:51 25 4
gpt4 key购买 nike

我试图从我的表数据生成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 &amp;&gt;&lt;</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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com