ऐसा लगता है कि आपको ISNUMERIC<के संस्करण की आवश्यकता है /ए> XML डेटा के लिए फ़ंक्शन।
अफसोस की बात है कि ऐसा कोई अंतर्निहित कार्य मौजूद नहीं है - इसलिए आपको अपना खुद का विकल्प तैयार करना होगा, जिसके लिए कुछ विकल्प हैं:
यदि यह एक बार की या छोटे पैमाने की प्रक्रिया है जिसके लिए प्रदर्शन महत्वपूर्ण नहीं है, तो आप TRY...CATCH
का उपयोग करके, कर्सर के अंदर एक बार में इनपुट तालिकाओं को एक पंक्ति में संसाधित कर सकते हैं। अमान्य कास्ट (अप्रयुक्त) को संभालने के लिए ब्लॉक करें:
DECLARE xmlCur CURSOR FOR
SELECT textcol
FROM inputTable
OPEN xmlCur
DECLARE @string nvarchar(MAX)
DECLARE @xml xml
FETCH NEXT FROM xmlCur into @string
WHILE @@fetch_status = 0
BEGIN
BEGIN TRY
SET @xml = CAST(@string AS XML)
-- Do something with XML
END TRY
BEGIN CATCH
-- log failure/mark source row as invalid
END CATCH
FETCH NEXT FROM xmlCur into @string
END
CLOSE xmlCur
DEALLOCATE xmlCur
वैकल्पिक रूप से, यदि आप नेट प्रोग्रामिंग के साथ सहज हैं (और यह आपके सर्वर पर सक्षम है) तो आप CLR अपना खुद का IsXML फ़ंक्शन बनाने के लिए। .नेट कोड को इस थ्रेडपर तीसरी पोस्ट से अधिक जटिल नहीं होना चाहिए। ए> ।
हो सकता है कि CLR समाधान का प्रदर्शन कर्सर से इतना बेहतर न हो - इसे स्थापित करने के लिए आपको परीक्षण करने की आवश्यकता होगी।
(कोशिश करने के लिए एक स्पष्ट बात, जो काम नहीं करती है, एक स्केलर-मूल्यवान टी-एसक्यूएल फ़ंक्शन है जो फ़ील्ड को TRY...CATCH
के अंदर एक्सएमएल में डालने का प्रयास करता है। खंड मैथा। हालांकि, TRY...CATCH
किसी समारोह के अंदर अनुमति नहीं है।)