Sql 如何分配xml类型的变量并利用无效字符的自动转义?
在分配给xml类型变量时,如何利用sql server的自动转义无效字符 此查询将正确转义无效字符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
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: </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中运行它可以工作。你错过分号了吗?