Мне тяжело бороться с XML в Sql Server 2008. У меня есть XML-документ, который мне нужно проанализировать в наборе строк. Я пытаюсь создать пример запроса, который при выполнении с большим двоичным объектом возвращает результаты, такие как:
ID Status
-------- --------
3765aaf7-afaa-4a46-8499-5a61b607692c 0
1234aaf7-afaa-4a46-8499-5a61b607692c 1
Вот пример XML:
DECLARE @xml XML
SET @xml = '<Batch xmlns="urn:mynamespace">
<request xmlns:b="urn:mymessages">
<b:Batches xmlns:c="urn:myentities">
<c:BatchEntry>
<c:ID>3765aaf7-afaa-4a46-8499-5a61b607692c</c:ID>
<c:Status>0</c:Status>
</c:BatchEntry>
<c:BatchEntry>
<c:ID>1234aaf7-afaa-4a46-8499-5a61b607692c</c:ID>
<c:Status>1</c:Status>
</c:BatchEntry>
</b:Batches>
<b:BatchID>8492cbaa-eea5-479d-86c4-60cb62ac4b7c</b:BatchID>
</request>
</Batch>'
Самое близкое, с чем я пришел:
SELECT T.a.query('.') AS ID
FROM @xml.nodes('/*[local-name() = "Batch"]/*[local-name() = "request"]/*[local-name() = "Batches"]/*[local-name() = "BatchEntry"]/*[local-name() = "ID"]/text()') T(a)
Но я не могу понять, как в основном выбрать узел «Пакеты», а затем вернуть набор строк для каждого «Пакетного ввода». Я чувствую, что просто пока не понимаю некоторые операторы XML Sql Server ..:)
Ваша помощь очень ценится!
ОБНОВЛЕНИЕ 2011-01-07
С ответом @IanC ниже я смог получить полный рабочий экземпляр с пространствами имен xml того, что мне нужно было сделать. Я обновляюсь здесь на тот случай, если кто-то еще столкнется с ним.
DECLARE @xml XML
SET @xml =
'<Batch xmlns="urn:mynamespace">
<request xmlns:b="urn:mymessages">
<b:Batches xmlns:c="urn:myentities">
<c:BatchEntry>
<c:ID>3765aaf7-afaa-4a46-8499-5a61b607692c</c:ID>
<c:Status>0</c:Status>
</c:BatchEntry>
<c:BatchEntry>
<c:ID>1234aaf7-afaa-4a46-8499-5a61b607692c</c:ID>
<c:Status>1</c:Status>
</c:BatchEntry>
</b:Batches>
<b:BatchID>8492cbaa-eea5-479d-86c4-60cb62ac4b7c</b:BatchID>
</request>
</Batch>'
DECLARE @sp int
DECLARE @hxml int
DECLARE @Result int
DECLARE @t table
(
ID UNIQUEIDENTIFIER,
BatchStatus INT
)
EXEC @sp = sp_xml_preparedocument @hxml OUTPUT, @xml
,
'<Batch
xmlns:a="urn:mynamespace"
xmlns:b="urn:mymessages"
xmlns:c="urn:myentities"
/>'
if @sp != 0 begin
SET @Result = '0'
RETURN
end
INSERT INTO @t
SELECT *
FROM OPENXML (@hxml, '/a:Batch/a:request/b:Batches/c:BatchEntry', 2)
WITH
(
ID UNIQUEIDENTIFIER 'c:ID',
BatchStatus INT 'c:Status'
)
SELECT * FROM @t
EXEC sp_xml_removedocument @hxml;