请提供您的XML样本,因为以下所有内容都可以工作:
CONVERT(XML, '<root><child/></root>')
CONVERT(XML, '<root> <child/> </root>', 1)
CAST('<Name><FName>Carol</FName><LName>Elliot</LName></Name>' AS XML)
根据 Microsoft 的文档,您可能需要将其先转换为 nvarchar 或 varbinary(如下所示):
您可以通过将 SQL Server 字符串数据类型(例如 [n] [var] char、[n] text、varbinary 和 image)强制转换(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 编码文档,因此不需要 BOM。
varchar 字符串的内容由 XML 解析器视为一个字节编码的 XML 文档/片段。由于 varchar 源字符串具有关联的代码页,因此如果 XML 本身没有指定显式编码,则解析器将使用该代码页进行编码。如果 XML 实例具有 BOM 或编码声明,则 BOM 或声明需要与代码页一致,否则解析器将报告错误。
varbinary 的内容被视为传递直接到 XML 解析器的码点流。因此,XML 文档或片段需要在内联提供 BOM 或其他编码信息。解析器只会查看流以确定编码方式。这意味着采用 UTF-16 编码的 XML 需要提供 UTF-16 BOM,而没有 BOM 和没有声明的实例编码将被解释为 UTF-8。
如果 XML 文档的编码事先未知,并且数据在转换为 XML 之前作为字符串或二进制数据传递,建议将数据视为 varbinary。例如,当使用 OpenRowset()从 XML 文件中读取数据时,应将要读取的数据指定为 varbinary(max)值:
select CAST(x as XML)
from OpenRowset(BULK 'filename.xml', SINGLE_BLOB) R(x)
SQL Server内部使用高效的二进制表示法来表示XML,该表示法使用UTF-16编码。用户提供的编码不会被保留,但在解析过程中会予以考虑。
解决方案:
CONVERT(XML, CONVERT(NVARCHAR(max), ProductXML))