Возврат набора строк из ввода XML - PullRequest
2 голосов
/ 07 января 2011

Мне тяжело бороться с 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;

1 Ответ

2 голосов
/ 07 января 2011

Попробуйте это как общий шаблон. Если вам нужна дополнительная помощь, дайте мне знать, и я адаптирую ее к вашему XML.

DECLARE @t table (
    ProductTypeID   int,
    LowMin          real,
    HiMax           real,
    ParamTypeID     int,
    ParamWeight     real,
    Low             real,
    Hi              real,
    Mode            tinyint         
)

EXEC    @sp = sp_xml_preparedocument @hxml OUTPUT, @XMLText

if @sp != 0 begin
    SET @Result = '0'
    RETURN
end

INSERT INTO @t
SELECT      *
FROM        OPENXML (@hxml, '/query/product/param/item', 2)
WITH        (
            ProductTypeID   int     '../../@type',
            LowMin          real    '../@lowMin',
            HiMax           real    '../@hiMax',
            ParamTypeID     int     '../@type',
            ParamWeight     real    '@weight',
            Low             real    '@low',
            Hi              real    '@hi',
            Mode            tinyint '@mode'
            )

EXEC    sp_xml_removedocument @hxml;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...