2

これに対する解決策は私にはわかりません。あなたが助けてくれることを願っています。

テーブル[restrictions]のデータセットは次のようになります

    item_uid    include    the_value
    00035061     FALSE        'AZ'
    00035061     FALSE        'CA'
    00035061     TRUE         'NC'
    00035061     TRUE         'SC'

目的のXML結果は次のようになります。

<item>
    <item_uid>00035061</item_uid>
    <restrictions>
        <inclusions>
            <include>NC</include>
            <include>SC</include>
        </inclusions>
        <exclusions>
            <exclude>AZ</exclude>
            <exclude>CA</exclude>
        </exclusions>
    </restrictions>
<item>

両側を別々に組み立てることができます。

SELECT the_value AS 'data()'
FROM restrictions
WHERE include = TRUE AND item_uid = '00031762'
FOR XML PATH ('include'), ROOT ('inclusions')

その後

SELECT the_value AS 'data()'
FROM restrictions
WHERE include = FALSE AND item_uid = '00031762'
FOR XML PATH ('exclude'), ROOT ('exclusions')

しかし、1つのSQLステートメントでこのXMLを生成する方法を理解することはできません。ご協力ありがとうございます!

4

1 に答える 1

1

フィールドリストにサブクエリとしてクエリを含めることができます。

select D.item_uid,
       (
        select R.the_value as 'include'
        from restrictions as R
        where R.include = 1 and R.item_uid = D.item_uid
        for xml path (''), root ('inclusions'), type
       ) as 'restrictions',
       (
        select R.the_value as 'exclude'
        from restrictions as R
        where R.include = 0 and R.item_uid = D.item_uid
        for xml path (''), root ('exclusions'), type
       ) as 'restrictions'
from (select '00035061') as D(item_uid)
for xml path(''),  root('item')

SQLフィドル

typeディレクティブにより、クエリはテキストではなくXMLを返します。
両方のXML列に名前を付ける と、それぞれが1つではなくrestrictions、同じrestrictions要素になります。そこにあるだけなので、探しているものを1か所で
(select '00035061') as D(item_uid)指定できます。item_uid代わりに、それをパラメーターに置き換えたいと思うかもしれません。

于 2012-06-09T13:01:13.130 に答える