给我们一个您的 XML 样本,因为所有这些都可以工作:
CONVERT(XML, '<root><child/></root>')
CONVERT(XML, '<root> <child/> </root>', 1)
CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' AS XML)
此外,您可能必须先将其转换为 nvarchar 或 varbinary(来自 Microsoft 文档):
您可以通过将任何 SQL Server 字符串数据类型(例如 [n][var]char、[n]text、varbinary 和 image)解析为 xml 数据类型,方法是将字符串转换为 (CAST) 或将字符串转换为 (CONVERT) xml 数据类型。检查无类型 XML 以确认其格式正确。如果存在与 xml 类型关联的模式,则还会执行验证。有关详细信息,请参阅将类型化 XML 与非类型化 XML 进行比较。
XML 文档可以使用不同的编码(例如,UTF-8、UTF-16、windows-1252)进行编码。下面概述了有关字符串和二进制源类型如何与 XML 文档编码交互以及解析器如何行为的规则。
由于 nvarchar 采用两字节 unicode 编码,例如 UTF-16 或 UCS-2,因此 XML 解析器会将字符串值视为两字节 Unicode 编码的 XML 文档或片段。这意味着 XML 文档需要以两字节 Unicode 编码进行编码,以便与源数据类型兼容。UTF-16 编码的 XML 文档可以具有 UTF-16 字节顺序标记 (BOM),但它不需要,因为源类型的上下文清楚地表明它只能是两个字节的 Unicode 编码文档。
XML 解析器将 varchar 字符串的内容视为单字节编码的 XML 文档/片段。由于 varchar 源字符串具有关联的代码页,如果 XML 本身未指定显式编码,则解析器将使用该代码页进行编码 如果 XML 实例具有 BOM 或编码声明,则 BOM 或声明需要与代码页一致,否则解析器会报错。
varbinary 的内容被视为直接传递给 XML 解析器的代码点流。因此,XML 文档或片段需要内嵌提供 BOM 或其他编码信息。解析器只会查看流以确定编码。这意味着 UTF-16 编码的 XML 需要提供 UTF-16 BOM,并且没有 BOM 且没有声明编码的实例将被解释为 UTF-8。
如果事先不知道 XML 文档的编码,并且在转换为 XML 之前将数据作为字符串或二进制数据而不是 XML 数据传递,则建议将数据视为 varbinary。例如,当使用 OpenRowset() 从 XML 文件中读取数据时,应该将要读取的数据指定为 varbinary(max) 值:
select CAST(x as XML)
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)
SQL Server 在内部以使用 UTF-16 编码的高效二进制表示形式表示 XML。不保留用户提供的编码,但在解析过程中会考虑。
解决方案:
CONVERT(XML, CONVERT(NVARCHAR(max), ProductXML))