Правильный ответ: easy-cheese и полный ответ:
Ваш XML:
DECLARE @XMLResult XML=
N'<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
<soap:Body>
<HCNSearchResponse xmlns="http://testurl.com/">
<HCNSearchResult>
<HCNLookupResult>
<MsgID>test1</MsgID>
<Results>
<DemographicDetails>
<Title>Ms</Title>
<Forename1>F1 test</Forename1>
<Forename2 />
<Forename3>F3 test</Forename3>
<Sex>F</Sex>
<DateOfBirth>01/01/2000</DateOfBirth>
<Surname>test1</Surname>
</DemographicDetails>
<DemographicDetails>
<Title>Mr</Title>
<Forename1>F1 test</Forename1>
<Forename2 />
<Forename3></Forename3>
<Sex>M</Sex>
<DateOfBirth>01/01/2000</DateOfBirth>
<Surname>test2</Surname>
</DemographicDetails>
</Results>
</HCNLookupResult>
</HCNSearchResult>
</HCNSearchResponse>
</soap:Body>
</soap:Envelope>';
- правильный ответ предоставляется@bdebaere уже.Если вы согласны с этим, пожалуйста, установите там согласие (но вы, конечно, можете проголосовать выше ;-)).
- Но вы можете сформулировать то же самое с одним объявлением пространства имен для всех:
- Преимущество: есливы использовали несколько вызовов XML-методов, в противном случае вам придется повторять объявления снова и снова ...
WITH XMLNAMESPACES(DEFAULT 'http://testurl.com/'
,'http://schemas.xmlsoap.org/soap/envelope/' AS [soap])
SELECT @XMLResult.query('/soap:Envelope/soap:Body/HCNSearchResponse/HCNSearchResult/HCNLookupResult/Results');
- подход easy-cheese использует глубокий поиск и подстановочный знак пространства имен
- Общий совет: будьте настолько конкретны, насколько это возможно, но иногда ленивые побеждают ...
SELECT @XMLResult.query('//*:Results')
- и полный ответ был таким:
WITH XMLNAMESPACES(DEFAULT 'http://testurl.com/'
,'http://schemas.xmlsoap.org/soap/envelope/' AS [soap])
SELECT dd.value('(Title/text())[1]','nvarchar(max)') AS Title
,dd.value('(Forename1/text())[1]','nvarchar(max)') AS Forename1
,dd.value('(Forename2/text())[1]','nvarchar(max)') AS Forename2
,dd.value('(Forename3/text())[1]','nvarchar(max)') AS Forename3
,dd.value('(Sex/text())[1]','nvarchar(1)') AS Sex
,dd.value('(DateOfBirth/text())[1]','nvarchar(max)') AS DateOfBirth --Hint: don't use 'datetime' here. Rather pull this data as string and use CONVERT with the appropriate style hint
,dd.value('(Surname/text())[1]','nvarchar(max)') AS Surname
FROM @XMLResult.nodes('/soap:Envelope/soap:Body/HCNSearchResponse/HCNSearchResult/HCNLookupResult/Results/DemographicDetails') A(dd);
Результат
+-------+-----------+-----------+-----------+-----+-------------+---------+
| Title | Forename1 | Forename2 | Forename3 | Sex | DateOfBirth | Surname |
+-------+-----------+-----------+-----------+-----+-------------+---------+
| Ms | F1 test | NULL | F3 test | F | 01/01/2000 | test1 |
+-------+-----------+-----------+-----------+-----+-------------+---------+
| Mr | F1 test | NULL | NULL | M | 01/01/2000 | test2 |
+-------+-----------+-----------+-----------+-----+-------------+---------+