2010-09-22 15 views
7

में एक varbinary (अधिकतम) कॉलम में अमान्य एक्सएमएल तो मुझे SQL Server 2005 में varbinary(max) कॉलम मिला और यह एक्सएमएल से भरा है। कुछ रिकॉर्ड्स ने कहीं एक्सएमएल को छोटा कर दिया है, इसलिए वे अमान्य हैं।SQL सर्वर 2005

इसका मतलब यह है कि अगर मैं एक

SELECT CAST(myVarbinaryColumn as XML) ... 

यह हिस्सा चल रही है चलाते हैं।

मैं अवैध XML को कैसे फ़िल्टर/छोड़ सकता हूं?

जब मैंने एक वर्चर के साथ ऐसा किया है जो माना जाता है कि मैं ISDATE(blah) = 1 का उपयोग कर सकता हूं। तो समकक्ष ISVALIDXML() अच्छा होगा।

कृपया इस बारे में टिप्पणी न करें "कॉलम एक्सएमएल डेटाटाइप क्यों नहीं है .." यह अतीत में हुआ और मेरे पास टाइम मशीन नहीं है।

+0

हम्म दिलचस्प, अंतिम बाइट हमेशा एक जैसा होगा ताकि मैं उन लोगों को फ़िल्टर कर सकूं जो मेल नहीं खाते? सौभाग्य से इस परिदृश्य में एक्सएमएल सभी एक ही स्कीमा का उपयोग करते हैं, इसलिए उनके पास एक मिलान करने वाला मूल तत्व –

उत्तर

1

मुझे लगता है कि आपकी सबसे अच्छी शर्त CLR function लिखना होगा, शायद XmlDocument.Load का उपयोग करना। सीएलआर में आप असफल लोड पर त्रुटि को फंस सकते हैं और उचित परिणाम लौटा सकते हैं।

संपादित करें: नीचे दिया गया कोड भी काम करेगा हालांकि यह यूडीएफ के रूप में सुरुचिपूर्ण नहीं है। दुर्भाग्यवश, हम एक यूडीएफ में TRY/CATCH का उपयोग नहीं कर सकते हैं।

create procedure dbo.usp_IsValidXML(@XMLCandidate varbinary(max), @Return bit output) 
as 
begin 
    declare @x xml 
    begin try 
     set @x = cast(@XMLCandidate as xml) 
     set @Return = 1 
    end try 
    begin catch 
     set @Return = 0 
    end catch 
end 
go 

declare @test1 varbinary(max) 
declare @test2 varbinary(max) 
set @test1 = cast('<data>asdf</data>' as varbinary(max)) 
set @test2 = cast('<data>asdf</da' as varbinary(max)) 

declare @IsValid bit 
exec dbo.usp_IsValidXML @test1, @IsValid output 
select @IsValid 
exec dbo.usp_IsValidXML @test2, @IsValid output 
select @IsValid 

drop procedure dbo.usp_IsValidXML 
+0

हां होना चाहिए, और इसके आधार पर एक सतत गणना कॉलम बनाएं, इसलिए जब भी आप 'valid_xml = 1' 'जाते हैं तो इसे कॉल नहीं किया जाता है। – GSerg

+0

क्या यह निर्धारक होगा? –

1

काश मैं था IsValidXML() समारोह, भी ..... दुर्भाग्य से, मैं नहीं वहाँ ऐसा कुछ है लगता है कि .....

बस एक विचार: वहाँ कुछ भी आप के लिए जांच कर सकता है अमान्य एक्सएमएल फ़िल्टर करें ??

उदा। क्या आप उन सभी तारों को फ़िल्टर कर सकते हैं जो .....</data> में समाप्त नहीं होते हैं या ऐसा कुछ ?? (यह देखते हुए कि आप कहते हैं कि आपका अमान्य एक्सएमएल आम तौर पर एक्सएमएल को छोटा कर देता है, इसलिए मुझे लगता है कि बंद टैग - </data> या जो कुछ भी - उन मामलों में गायब होगा)।