2011-12-01 45 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

相關問題