I found using sqlxml
is very handy for quering xml, in your case you need nodes()
and value()
functions:
;with xmlnamespaces ('http://www.endpoint.com/' as ns2)
select
T.C.value('(../../company/text())[1]', 'nvarchar(max)') as Company,
T.C.value('(../../lineOfBusiness/text())[1]', 'nvarchar(max)') as lineOfBusiness,
T.C.value('(../../caseNumber/text())[1]', 'nvarchar(max)') as caseNumber,
T.C.value('(../../creationDate/text())[1]', 'datetime2') as creationDate,
T.C.value('(reviewNumber/text())[1]', 'nvarchar(max)') as reviewNumber,
T.C.value('(revision/text())[1]', 'nvarchar(max)') as revision,
T.C.value('(sequence/text())[1]', 'nvarchar(max)') as sequence
from @Data.nodes('ns2:procedure1/auth/reviews/reviews') as T(C)
It's also possible to do with nested nodes()
functions:
;with xmlnamespaces ('http://www.endpoint.com/' as ns2)
select
A.C.value('(company/text())[1]', 'nvarchar(max)') as Company,
A.C.value('(lineOfBusiness/text())[1]', 'nvarchar(max)') as lineOfBusiness,
A.C.value('(caseNumber/text())[1]', 'nvarchar(max)') as caseNumber,
A.C.value('(creationDate/text())[1]', 'datetime2') as creationDate,
R.C.value('(reviewNumber/text())[1]', 'nvarchar(max)') as reviewNumber,
R.C.value('(revision/text())[1]', 'nvarchar(max)') as revision,
R.C.value('(sequence/text())[1]', 'nvarchar(max)') as sequence
from @Data.nodes('ns2:procedure1/auth') as A(C)
outer apply A.C.nodes('reviews/reviews') as R(C)
But in any case, to get all reviews, you have to path ns2:procedure1/auth/reviews/reviews
xpath to openxml
(or nodes()
) function, so you'll have all reviews as rows.
If you're really want to use openxml
, then change your query like:
...
SELECT *
FROM OPENXML(@hDoc, N'/ns2:procedure1/auth/reviews/reviews')
WITH (company NVARCHAR(25) '../../company',
lineOfBusiness NVARCHAR(50) '../../lineOfBusiness',
caseNumber NVARCHAR(30) '../../caseNumber',
creationDate DATETIME2 '../../creationDate',
reviews_reviews_reviewNumber NVARCHAR(20)'reviewNumber',
reviews_reviews_revision INT 'revision',
reviews_reviews_sequence INT 'sequence')
...