Блідий. Це було справді корисною ниткою для виявлення.
Деякі з цих пропозицій я все-таки заплутав. Всякий раз , коли я 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)