2013-07-30 2 views
8

में परिवर्तित करें मेरे पास वर्चुअल कॉलम में संग्रहीत कुछ वैध और अमान्य xml मान हैं।टी-एसक्यूएल: वर्चर को xml

मैं मान्य xml मानों को वास्तविक xml डेटा प्रकार में डालना चाहता हूं और शून्य से अमान्य हूं।

ऐसा करने का एक अच्छा तरीका क्या है?

कुछ की तरह:

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

एसक्यूएल सर्वर के किन संस्करणों? –

+0

माइक्रोसॉफ्ट एसक्यूएल सर्वर 2008 (एसपी 1) – David

+1

क्या आप अमान्य एक्सएमएल को अस्वीकार करने के लिए ** इस डेटा के लोडिंग ** के दौरान कोई प्रक्रिया नहीं चला सकते हैं, अन्यथा जब आप इस चयन कथन का उपयोग करते हैं तो आप इस क्वेरी को एक फ़ंक्शन के माध्यम से चला रहे हैं, जो नहीं है प्रदर्शन के लिए आदर्श। – christiandev

उत्तर

0

आप चाहे मान्य है या अमान्य एक्सएमएल रखने की जरूरत है, तो आप एक झंडाIsValid (bit) की तरह मेज पर हो सकता था। लोडिंग प्रक्रिया तब जांच कर सकती है कि एक्सएमएल मान्य है या नहीं, परिणाम के आधार पर ध्वज सेट करें या नहीं। इस तरह से आप क्वेरी का उपयोग करके मान्य XML प्राप्त कर सकते हैं:

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

आप अमान्य XML रखने की जरूरत नहीं है, तो बस इसे लोड करने के दौरान अस्वीकार करते हैं, NULL को क्षेत्र की स्थापना, तो क्वेरी लगेगा जैसे:

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

दोनों तरीकों से बेहतर प्रदर्शन है कि प्रत्येक क्वेरी के लिए एक SQL function के माध्यम से गुजर दे देंगे।

+1

हां, लेकिन मेरे प्रश्न का गोमांस यह है कि मैं कैसे जांचूं कि एक्सएमएल पहली जगह मान्य है? – David

+0

'मेरे पास वर्चर कॉलम में संग्रहीत कुछ वैध और अमान्य xml मान हैं।' - क्या यह संग्रहण आपके नियंत्रण में है? या आप एक पूर्व-जनसंख्या वाली तालिका के खिलाफ पूछताछ कर रहे हैं? – christiandev

+0

एक पूर्वनिर्धारित तालिका। असल में, मुझे टी-एसक्यूएल का उपयोग कर एक्सएमएल स्ट्रिंग वैधता की जांच करने का एक तरीका चाहिए। – David

4

केवल इसी के जवाब में:

हाँ, पर मेरे सवाल का मांस है मैं कैसे की जाँच करते एक्सएमएल में मान्य है पहली जगह है?

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

एक समाधान मैं देख रहा हूँ एक पंक्ति-दर-पंक्ति दृष्टिकोण है, जहाँ आप का प्रयास करें:

है कि आप इस नीचे दूसरी पंक्ति की तरह एक ब्रेक मिल जाएगा अर्थों में अपने XML अमान्य है और CASTXML के रूप में एक पंक्ति, और यदि यह XML के रूप में रहता है तो मान्य XML मानों के साथ वैध तालिका को सफलतापूर्वक डालें, अगर यह सही ढंग से नहीं डाला जाएगा, तो मान डाला नहीं गया है। See this thread for examples

+1

अन्य धागे के लिंक के लिए धन्यवाद, जहां यह प्रश्न में टोकन के लिए मैन्युअल रूप से पार्स करने का सुझाव दिया गया था। यही वह है जो मैंने कर दिया। – Alan

1

कोशिश का उपयोग करने के 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 

आउटपुट -

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

------------------------- 
"<t>test</t>" is valid 
संबंधित मुद्दे