2011-12-01 17 views
24

Temel olarak XML türünde TEXT türünde bir sütun var; Bu başka sebeplerden dolayı değiştirilemez, ancak XML'e nasıl yazabileceğimi merak ediyordum. Bunu yapmak çalışırken kodlamasınıSQL Server'da TEXT XML'e dönüştürülemiyor

geçiş yapamıyorsunuz hat 1, karakter 39: Bana bir hata

XML ayrıştırma verir

. XML için biçimlendirilmiş olması hala var mı? Bu noktada gerçekten sıkışmış durumdayım. sütun içinde

veri:

<?xml version="1.0" encoding="utf-16"?> 
<Record> 
    <UserGuid>c624a356-9f18-403c-b404-790e79034c7d</UserGuid> 
</Record> 
İşte

döküm SQL kodudur:

SELECT CAST(XML AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)') 
FROM tbl_Module_RequestForms_Items 

cevap

45

Kişisel sorununa encoding="utf-16" değiştirilmesi olduğunu , sen iç içe iki CAST Eğer aradığınızı elde etmek yapmak zorunda:

SELECT 
    CAST(CAST(XML AS NTEXT) AS XML).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)') 
FROM 
    tbl_Module_RequestForms_Items 

İlk olarak,yayın yapmak için ihtiyaç 210 (veya NVARCHAR(MAX)) ve daha sonra kullanabilmeniz için bu sonucu XML'a göndermeniz gerekir.

İpucu: NTEXT problemi CAST(CAST (XML AS NTEXT) AS XML) çözer gibi XML değişkeni Döküm .....

+0

Bu yöntemi denerseniz ´illegal xml karakter hatası alıyorum. SQL Server 2008 R2. Herhangi bir fikir? – Azimuth

+0

@Azimuth: yeni bir soru gibi geliyor - ve örnek XML'yi gönderdiğinizden emin olun! –

+0

@marc_s Sorunun XML dizgimde vurgu karakterleri olduğunu düşünüyorum ... – Azimuth

-1

Eğer CONVERT yerine CAST denediniz mi?

SELECT CONVERT(XML, @xml).value('(/Record/UserGuid)[1]', 'NVARCHAR(max)') 
from tbl_Module_RequestForms_Items 

Ayrıca, bu sayfanın "xml stilleri" bölümüne bakın; o xml dönüştürürken sahip bazı seçenekler içerir:

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

+0

Ya da çalışmıyor ... dört stilleri kullanılabilir, çünkü giriş temelde Unicode, ancak içinde depolanan veri türü Unicode olmayan bir –

+0

Evet, çivilenmiş; Sizin için bir öneri ... – JohnD

25

Sen encoding="utf-8" veya ''(blank) için encoding="utf-16" yerine ve sonra işlemi gerçekleştirmek gerekir.

a. 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" dönüştürülüyor. Bir encoding="utf-16" ile XML sahip, ancak sütun ......

ya NTEXT bunu değiştiremezsiniz varsayarsak bir Unicode olmayan sütundur: ''(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

Keşke her ikisini de işaretleyebilseydim, sen ve Marcs'ın her ikisi de harika çalışan yöntemler vardı. Yine de seninkini kestim. Tekrar teşekkürler! –

+0

Merhaba @thesandman, destek için teşekkür ederim, ben de sana oy verdim. Size en iyi şekilde cevap vermek için elimden gelenin en iyisini yapmaya çalıştım. Zaman ayırdığın için teşekkürler. –

+4

Geri ve ileri işler döküm benim için işe yaramadı, ama burada açıklandığı gibi ''encoding =" UTF-8 "ibaresini kaldırmak hile yaptı. – dakab

2

o "diğer nedenler" kaldırmak ve gerçekten XML olarak kullanmak gerekiyorsa XML veri türüne bu dönüştürün.

+0

Bu, düşük bir cevaptır. – DarkKnight

İlgili konular