无法在SQL Server中将TEXT转换为XML

时间:2011-12-01 00:08:49

标签: sql-server xml sql-server-2005

基本上我有一个名为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

6 个答案:

答案 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时的一些选项:

http://msdn.microsoft.com/en-us/library/ms187928.aspx

答案 5 :(得分:-1)

在转换为XML之前,您需要更改编码。

CAST (REPLACE(MyTextToCastToXML, 'utf-8', 'utf-16') AS XML)