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 Server ของคุณเอง
การพูดซึ่งนี่คือคำตอบที่ถูกต้องสำหรับคำถามนี้
สมมติว่าคุณมีข้อมูล 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)