Astaga. Ini adalah utas yang sangat berguna untuk ditemukan.
Saya masih menemukan beberapa dari saran ini membingungkan. Setiap kali saya menggunakan value
dengan [1]
dalam string, itu hanya akan mengambil nilai pertama. Dan beberapa saran merekomendasikan penggunaan cross apply
yang (dalam pengujian saya) hanya menghasilkan terlalu banyak data.
Jadi, inilah contoh sederhana saya tentang cara membuat xml
objek, lalu membacakan nilainya ke dalam tabel.
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)
Dan inilah hasilnya:
Ini sintaks yang aneh, tetapi dengan contoh yang layak, cukup mudah untuk menambahkan fungsi SQL Server Anda sendiri.
Ngomong-ngomong, inilah jawaban yang benar untuk pertanyaan ini.
Dengan asumsi Anda memiliki data xml Anda dalam @xml
variabel tipe xml
(seperti yang ditunjukkan dalam contoh saya di atas), berikut ini cara Anda mengembalikan tiga baris data dari xml yang dikutip dalam pertanyaan:
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)