Как изменить значения при извлечении их из данных XML в SQL Server - PullRequest
0 голосов
/ 20 апреля 2011

Вот вопрос по XQuerying в SQL (SQL Server 2008)

Изначально у меня есть XML, который мне нужно вывести несколько иначе, для справки:

declare @XMLNODE table (id int identity, doc xml)
insert @XMLNODE (doc) values (   
'
 <Root>
    <Elements>
      <Items>
        <OldItem>

          <ID>1</ID>
          <Show Pointer="yes" />
          <Display Pointer="Display">
            <Detail1>some Details</Detail1>
          </DisplayDetails>

        </OldItem>
      </Items>
    </Elements>
    </Root>'
)

    SELECT  a.value('(ID)[1]','int') as ID,
    a.value('(Show/@Pointer)[1]', 'varchar(5)') AS ShowItem,
    a.value('Display[1]/@Pointer[1]="Display"', 'varchar(10)') as DisplayDetails, -- Set to 'true' or 'false'
    a.value('DisplayDetails[1][@Pointer[1]="Display"]/Detail1[1]', 'varchar(max)') as Detail1
    FROM    @XMLNODE t
    cross apply
    t.doc.nodes('//OldItem') x(a)
    FOR XML PATH ('Items'),
    ROOT('Elements')

Итак, теперь у меня есть такой XML:

<Elements>
  <Items>
    <ID>1</ID>
    <ShowItem>yes</ShowItem>
    <DisplayDetails>true</DisplayDetails>
    <Detail1>some Details</Detail1>
  </Items>
</Elements>

Хотите добавить некоторые, изменить это значение на 1 или нет, основываясь на том, было ли оно истинным / да и т. Д.

т.е.. желательно:

<Elements>
  <Items>
    <ID>1</ID>
    <ShowItem>1</ShowItem>
    <DisplayDetails>1</DisplayDetails>
    <Detail1>some Details</Detail1>
  </Items>
</Elements>

Кроме того, если <DisplayDetails>false</DisplayDetails> Я просто хочу обновить его до <DisplayDetails />.

Есть ли способ напрямую сравнить входные данные в запросе (например, да или нет) и установить его в 1 или 0 вместо true или false? Я использую .query для использования этих значений и при необходимости добавляю дополнительную информацию.

1 Ответ

0 голосов
/ 20 апреля 2011

Я не очень часто запрашиваю XML из SQL, но если бы я делал это для чего-то, что не было XML, я бы сделал что-то подобное в операторе SELECT:

SELECT  a.value('(ID)[1]','int') as ID,
case 
  when a.value('(Show/@Pointer)[1]', 'varchar(5)') = 'yes' then '1'
  else '0'
End case as 'ShowItem',
a.value('Display[1]/@Pointer[1]="Display"', 'varchar(10)') as DisplayDetails, -- Set to 'true' or 'false'
a.value('DisplayDetails[1][@Pointer[1]="Display"]/Detail1[1]', 'varchar(max)') as Detail1
FROM    @XMLNODE t
cross apply
t.doc.nodes('//OldItem') x(a)

Примечание: это не было опробовано, и я не на клиенте БД, чтобы убедиться, что мой синтаксис абсолютно правильный. Однако проверить значение из БД и показать что-то еще на основе этого значения относительно просто.

...