Sql 如何分配xml类型的变量并利用无效字符的自动转义?

Sql 如何分配xml类型的变量并利用无效字符的自动转义?,sql,xml,sql-server-2008,Sql,Xml,Sql Server 2008,在分配给xml类型变量时,如何利用sql server的自动转义无效字符 此查询将正确转义无效字符 SELECT TestCharacter "MyCharacter" FROM (SELECT 'An element with normal text and an invalid character: ' + CAST(0x1B00 AS NVARCHAR(128)) AS TestCharacter ) MyTable FOR XML AUTO ,ELEMENTS <MyTa

在分配给xml类型变量时,如何利用sql server的自动转义无效字符

此查询将正确转义无效字符

SELECT TestCharacter "MyCharacter"
    FROM (SELECT 'An element with normal text and an invalid character: ' + CAST(0x1B00 AS NVARCHAR(128)) AS TestCharacter
) MyTable
FOR XML AUTO ,ELEMENTS

<MyTable>
    <MyCharacter>An element with normal text and an invalid character: &#x1B;</MyCharacter>
</MyTable>

在XML中不是有效字符

在XML 1.0中:

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
SELECT CAST(@xml.value('(/MyTable/MyCharacter)[1]','varbinary(max)') AS nvarchar(max))
在XML 1.1中:

Char ::= #x9 | #xA | #xD | [#x20-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
Char ::= [#x1-#xD7FF] | [#xE000-#xFFFD] | [#x10000-#x10FFFF]
SELECT CAST(@xml.value('(/MyTable/MyCharacter)[1]','varbinary(max)') AS nvarchar(max))
#x1B
转义
字符)在两个列表中均无效。
FOR XML
成功将其实体化的事实是:

SQL Server在返回无效的XML字符时对其进行实体化 对于不使用TYPE指令的XML查询,请在中查找

尽管符合XML 1.0的解析器会在不考虑 无论这些字符是否被实体化,实体化的形式都是 更好地与XML1.1保持一致。实体化表单也可能是 更好地与XML标准的未来版本保持一致。另外,, 它使调试更简单,因为 角色变得可见

解决方案 如果要在XML中保留这些字符,必须将其转换为Base64编码:

编码

DECLARE @xml xml = 
(
    SELECT CAST(TestCharacter AS varbinary(max)) AS MyCharacter
        FROM (SELECT 'An element with normal text and an invalid character: ' + CAST(0x1B00 AS NVARCHAR(128)) AS TestCharacter
    ) MyTable
    FOR XML AUTO, ELEMENTS, TYPE, BINARY BASE64
)
这将在Base64中对字符串进行编码,得到如下XML:

<MyTable>
  <MyCharacter>QQBuACAAZQBsA...</MyCharacter>
</MyTable>

当我在chrome的第一个输出中打开XML文件时,它仍然给出无效字符错误。你确定是正确的吗?在MSSQLMS中运行它可以工作。你错过分号了吗?