SQL Server中无法将TEXT转换为XML

41

我的问题是,我有一个名为 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个回答

60

你的问题是:你的 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数据类型。


如果我尝试这种方法,会出现“非法的XML字符”错误。 SQL Server 2008 R2。有什么想法吗? - Azimuth
@Azimuth:听起来像是一个新问题 - 一定要发布示例XML! - marc_s
@Azimuth:在SO上把这个问题发成一个帖子吧!我相信一些XML大牛会看到并回答它的.... - marc_s
@marc_s,我已经做了:http://stackoverflow.com/questions/20116205/xml-parsing-illegal-character-in-the-end-of-the-string - Azimuth
1
希望我可以给这个回答点赞两次,非常感谢。 - Geoff Griswald

40

你应该将 encoding="utf-16" 替换为 encoding="utf-8" 或者 ''(空白),然后执行你的操作。

a. 将 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"替换为''(空白)

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

我希望我能标记两个答案,你和Marc_s都提供了非常好的方法。虽然我只给了你点赞。再次感谢! - the sandman
你好 @thesandman,感谢您的支持,我也已经给您点赞了。我尽力以多种方式正确回答了您的问题。感谢您的时间。 - Elias Hossain
9
来回更改并没有奏效,但是按照这里的建议移除明确的 encoding="UTF-8" 却解决了问题。 - dakab

4

将XML变量转换为NTEXT类型可以解决该问题 CAST(CAST (XML AS NTEXT) AS XML).


这是一个被低估的答案。 - Sateesh Pagolu

3

将 encoding="utf-8" 替换为 encoding="utf-16" 对我有效 :)


2

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

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

-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


也不起作用.... 因为输入基本上是Unicode,但存储它的数据类型不是Unicode,所以四种可用样式都不起作用。 - marc_s

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接