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

标签 sql sql-server xml tsql xpath

我试图从我的表数据生成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/

相关文章:

mysql - 更正错误的 insert-from-select SQL 语句

sql - 选择 Oracle 字典 View 中可能不存在的列

java - 在 Android 中从 HTTP 检索 XML/流的最佳实践

java - Android 应用程序在 startActivity 上崩溃

javascript - 显示 XML 文件中的数据

Mysql查询(where和group)

sql - 使用 SQL 删除没有 shell 访问权限的旧 MediaWiki 修订版?

sql - 将数据从最大长度为 50 的字符串移动到最大长度为 20 的字符串时,SSIS 截断警告

sql - 打开和读取文本文件的存储过程

sql-server - SQL Server 2005 数据类型和 VB.NET