0

これは、SQL での XQuerying (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>

true/yes などに基づいて、これを 1 または値なしに変更します。

すなわち望ましい:

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

また、<DisplayDetails>false</DisplayDetails>単に更新したい場合は<DisplayDetails />.

クエリの入力を直接比較して (たとえば、はいまたはいいえ)、true または false の代わりに 1 または 0 に設定する方法はありますか? これらの値を使用し、必要に応じて追加情報を追加するために .query を使用しています。

4

1 に答える 1

0

SQL から XML をクエリすることはあまりありませんが、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)

注:これは試していません。また、構文が正確であることを確認するためにDBクライアントを使用していません。ただし、DB から値をチェックし、その値に基づいて別のものを表示するのは比較的簡単です。

于 2011-04-20T16:25:39.370 に答える