Blimey। यह वास्तव में उपयोगी धागा था।
मुझे अभी भी इनमें से कुछ सुझाव भ्रामक लगे। जब भी मैं प्रयोग किया जाता है value
के साथ [1]
स्ट्रिंग में, यह केवल पहले मान लिया गया होता। और कुछ सुझावों का उपयोग करके cross apply
(मेरे परीक्षणों में) अभी बहुत अधिक डेटा वापस लाया गया।
तो, यहाँ मेरा सरल उदाहरण है कि आप किस तरह से एक xml
वस्तु का निर्माण करेंगे , फिर एक तालिका में इसके मूल्यों को पढ़ें।
DECLARE @str nvarchar(2000)
SET @str = ''
SET @str = @str + '<users>'
SET @str = @str + ' <user>'
SET @str = @str + ' <firstName>Mike</firstName>'
SET @str = @str + ' <lastName>Gledhill</lastName>'
SET @str = @str + ' <age>31</age>'
SET @str = @str + ' </user>'
SET @str = @str + ' <user>'
SET @str = @str + ' <firstName>Mark</firstName>'
SET @str = @str + ' <lastName>Stevens</lastName>'
SET @str = @str + ' <age>42</age>'
SET @str = @str + ' </user>'
SET @str = @str + ' <user>'
SET @str = @str + ' <firstName>Sarah</firstName>'
SET @str = @str + ' <lastName>Brown</lastName>'
SET @str = @str + ' <age>23</age>'
SET @str = @str + ' </user>'
SET @str = @str + '</users>'
DECLARE @xml xml
SELECT @xml = CAST(CAST(@str AS VARBINARY(MAX)) AS XML)
-- Iterate through each of the "users\user" records in our XML
SELECT
x.Rec.query('./firstName').value('.', 'nvarchar(2000)') AS 'FirstName',
x.Rec.query('./lastName').value('.', 'nvarchar(2000)') AS 'LastName',
x.Rec.query('./age').value('.', 'int') AS 'Age'
FROM @xml.nodes('/users/user') as x(Rec)
और यहाँ उत्पादन है:
यह विचित्र सिंटेक्स है, लेकिन एक सभ्य उदाहरण के साथ, अपने स्वयं के SQL सर्वर फ़ंक्शन को जोड़ना काफी आसान है।
जिसके बारे में बोलते हुए, यहाँ इस प्रश्न का सही उत्तर है।
मान लें कि आपके पास अपना xml डेटा @xml
प्रकार के चर में है xml
(जैसा कि ऊपर मेरे उदाहरण में प्रदर्शित किया गया है), यहां बताया गया है कि आप प्रश्न में उद्धृत xml से डेटा की तीन पंक्तियों को कैसे लौटाएंगे:
SELECT
x.Rec.query('./firstName').value('.', 'nvarchar(2000)') AS 'FirstName',
x.Rec.query('./lastName').value('.', 'nvarchar(2000)') AS 'LastName'
FROM @xml.nodes('/person') as x(Rec)