2013-07-30 15 views
8

Bir varchar sütunda depolanmış bazı geçerli ve geçersiz xml değerlerim var.t-sql: varchar'ı xml'ye dönüştür

Ben boş değerlere gerçek xml veri türü ve geçersiz geçerli xml değerleri döküm istiyorum

.

Bunu yapmanın iyi bir yolu nedir? gibi

şey: Eğer geçerli veya geçersiz olsun XML tutmak gerekiyorsa

SELECT 
    CASE WHEN dbo.isValidXML(xml_data) THEN CAST(xml_data as XML) 
    ELSE null 
END 
+0

SQL Server sürümü nedir? –

+0

Microsoft SQL Server 2008 (SP1) – David

+1

Geçersiz XML'yi reddetmek için bu verilerin ** yüklenmesi sırasında bir işlem yapamazsınız, aksi halde bu sorguyu her kullandığınızda bu sorguyu bir işlev üzerinden çalıştırıyorsunuzdur. performans için ideal. – christiandev

cevap

0

, sen IsValid (bit) gibi masaya bayrak olabilir. Yükleme işlemi daha sonra XML'in geçerli olup olmadığını kontrol etmek ve sonuca göre bayrağı ayarlamak için bu veriyi bir kez kontrol edebilir. Bu şekilde sorguyu kullanarak geçerli XML alabilirsiniz: NULL alanını ayarlayarak, geçersiz XML tutmak gerekmiyorsa

SELECT 
    CASE WHEN IsValid = 1 THEN CAST(xml_data as XML) 
    ELSE null 
END 

, o zaman sadece yükleme sırasında reddetmek, böylece sorgu olmazdı gibi:

SELECT 
    CASE WHEN xml_data IS NOT NULL THEN CAST(xml_data as XML) 
    ELSE null 
END 

her iki yol da her sorgu için SQL function geçerek daha iyi performans verecektir. yalnızca Buna karşılık olarak

+1

Evet, ama sorumun kaynağı, XML'in ilk etapta geçerli olup olmadığını nasıl kontrol ederim? – David

+0

'Varchar sütununda saklı bazı geçerli ve geçersiz xml değerlerim var. '- Bu depolama adımı kontrolünüz altında mı? veya önceden doldurulmuş bir masaya mı soruyorsunuz? – christiandev

+0

önceden doldurulmuş bir tablo. Temel olarak, t-sql kullanarak XML dizesi geçerliliğini kontrol etmenin bir yoluna ihtiyacım var. – David

4

:

Evet, ama benim soru sığır nasıl kontrol ederim XML ilk yer geçerlidir nedir? Gördüğüm

SELECT CAST('<xml>Yep this is xml</xml>' AS XML) 
SELECT CAST('<xml>Nope, not xml</x' AS XML) 

bir çözüm satır-by-satır yaklaşımdır, sen dene:

bu aşağıdaki ikinci çizgi gibi bir mola alırsınız anlamında XML geçersiz mi o XML olarak atmalarını ve eğer CAST bir sıra XML olarak ve başarıyla doğru döküm etmezse, değer takılmamış, geçerli XML değerlere sahip bir tabloya geçerli satır ekleyin. See this thread for examples.

+1

Söz konusu belirteç için el ile ayrıştırmayı önerdiği diğer iş parçacığı bağlantısı için teşekkürler. Yaptığım şey bu. – Alan

1

deneyin kullanmak sp_xml_preparedocument -

SET NOCOUNT ON; 

DECLARE @XML NVARCHAR(MAX) 
SELECT @XML = '<t>test</' 

DECLARE @hDoc INT 

BEGIN TRY 

    EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML 
    SELECT '"' + @XML + '" is valid' 
    EXEC sys.sp_xml_removedocument @hDoc 

END TRY 
BEGIN CATCH 
    SELECT '"' + @XML + '" is invalid'  
END CATCH 

SELECT @XML = '<t>test</t>' 

BEGIN TRY 

    EXEC sys.sp_xml_preparedocument @hDoc OUTPUT, @XML 
    SELECT '"' + @XML + '" is valid' 
    EXEC sys.sp_xml_removedocument @hDoc 

END TRY 
BEGIN CATCH 
    SELECT '"' + @XML + '" is invalid'  
END CATCH 

Çıktı -

------------------------- 
"<t>test</" is invalid 

------------------------- 
"<t>test</t>" is valid