Blimey. 이것은 발견하기에 정말 유용한 스레드였습니다.
여전히 이러한 제안 중 일부가 혼란스러워졌습니다. 문자열에서 value
with [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)