基本上我有一个名为XML
的列,其类型为TEXT
;这不能因为其他原因而改变,但我想知道如何将它转换为XML。
它给了我一个错误
XML解析:第1行,第39个字符,无法切换编码
试图这样做时。是否还有它仍然将它格式化为XML?我真的很困难。
列内的数据:
<?xml version="1.0" encoding="utf-16"?>
<Record>
<UserGuid>c624a356-9f18-403c-b404-790e79034c7d</UserGuid>
</Record>
以下是强制转换SQL代码:
SELECT CAST(XML AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
FROM tbl_Module_RequestForms_Items
答案 0 :(得分:51)
您的问题是:您的XML包含encoding="utf-16"
,但您的列是非Unicode列......
假设您无法将其更改为NTEXT
,则必须执行两个嵌套CAST
来实现您的目标:
SELECT
CAST(CAST(XML AS NTEXT) AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
FROM
tbl_Module_RequestForms_Items
首先,您需要转换为NTEXT
(或NVARCHAR(MAX)
),然后您必须将该结果投射到XML
,然后才能使用它。
提示:删除这些“其他原因”并将其转换为XML
数据类型,如果您确实需要将其用作XML .....
答案 1 :(得分:32)
您应该将encoding="utf-16"
替换为encoding="utf-8"
或''(blank)
,然后执行操作。
一个。将encoding="utf-16"
转换为encoding="utf-8"
SELECT
CAST(
REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', 'encoding="utf-8"')
AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid
from tbl_Module_RequestForms_Items
湾将encoding="utf-16"
替换为''(blank)
SELECT
CAST(
REPLACE(CAST([xml] AS VARCHAR(MAX)), 'encoding="utf-16"', '')
AS XML).value('(/Record//UserGuid/node())[1]', 'NVARCHAR(max)') as UserGuid
from tbl_Module_RequestForms_Items
答案 2 :(得分:3)
将XML变量转换为NTEXT解决了这个问题
CAST(CAST (XML AS NTEXT) AS XML)
。
答案 3 :(得分:0)
曾用过将encoding =“ utf-8”替换为encoding =“ utf-16”。 :)
答案 4 :(得分:-1)
您是否尝试过CONVERT
而不是CAST
?
SELECT CONVERT(XML, @xml).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)')
from tbl_Module_RequestForms_Items
另外,请查看此页面的“xml样式”部分;它包含转换xml时的一些选项:
答案 5 :(得分:-1)
在转换为XML之前,您需要更改编码。
CAST (REPLACE(MyTextToCastToXML, 'utf-8', 'utf-16') AS XML)