2011-12-01 42 views
24

基本上我有一个名为XML的列,其类型为TEXT;由于其他原因无法更改,但我想知道如何将它转换为XML。无法将TEXT转换为SQL Server中的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 

回答

45

你的问题是:你有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 .....

+0

如果我尝试这种方法,则会出现“错误的xml字符”错误。 SQL Server 2008 R2。有任何想法吗? – Azimuth

+0

@Azimuth:听起来像一个新问题 - 一定要发布示例XML! –

+0

@marc_s我认为问题是在我的XML字符串中使用重音字符... – Azimuth

-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

+0

无法正常工作....这四种样式中没有一种可用,因为输入基本上是Unicode,但其存储的数据类型是非Unicode –

+0

是的,你钉了它;其中一个为你效力... – JohnD

25

此时应更换encoding="utf-16"encoding="utf-8"''(blank),然后执行您的操作。

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 

b。更换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 
+0

我希望我可以标记正确的,你和Marc_s都有很好的方法。我虽然赞成你的。再次感谢! –

+0

你好@thesandman,谢谢你的支持,我也投票支持你。我尽量以多种方式正确回答你。谢谢你的时间。 –

+4

来回投射对我来说不起作用,但如这里所建议的那样去除显式的'encoding =“UTF-8”'。 – dakab

2

铸造XML变量作为NTEXT解决问题 CAST(CAST (XML AS NTEXT) AS XML)

+0

这是一个被低估的答案。 – DarkKnight

相关问题