0

SQLServer2008R2 の使用

現在、次のような XML タグ内 (タグ間ではない) にデータを含む XML タグがあります。

<zooid="1"><animals key="all" zebras="22" dogs="0" birds="4" /><animals key="all" workers="yes" vacation="occasion" /> ... *(more)*</zooid>
<zooid="2"><animals key="house" zebras="0" dogs="1" birds="2" /><animals key="house" workers="no" vacation="no" /> ... *(more)*</zoodid>

XML に対してクエリを実行するか、それに対して値関数を使用すると、値が存在しないタグ間を読み取ろうとするため、空白の値が返されます。タグの内部を読み取り、等号の前の値を列として解析し、引用符の間の値をそれらの列内の値として解析する必要があります (確かに、これを実行できる関数を作成できますが、これは非常に細心の注意を払う必要があります)。 、そしてこのようなものがすでに存在するかどうか興味があります)。では次のようになります。

Key | Zebras | Dogs | Birds | Key | Workers | Vacation | ... *(more)*

...そしてこれはデータの行で

all   | 22 | 0 | 4 | all   | yes | occasion | ... *(more)*
house | 0  | 1 | 2 | house | no  | no       | ... *(more)*

したがって、最終的な出力 (最初から 2 つの XML 行を使用するだけです) は、次の表形式のデータのようになります。

Key   | Zebras | Dogs | Birds | Key    | Workers | Vacation | ... *(more)*
================================================================
all   | 22     | 0    | 4     | all   | yes     | occasion | ... *(more)*
house | 0      | 1    | 2     | house | no      | no       | ... *(more)*

XML に対してクエリを実行する以外に、ツールを使用し、.queryツールを試しても.node(このスレッドCROSS APPLYを参照してください)、これを生成できませんでした。

4

2 に答える 2

1

これを試してみてください -

DECLARE @YourXML NVARCHAR(MAX)
SELECT @YourXML = '
    <zooid="1">
        <animals key="all" zebras="22" dogs="0" birds="4" />
        <animals key="all" workers="yes" vacation="occasion" />
    </zooid>
    <zooid="2">
        <animals key="house" zebras="0" dogs="1" birds="2" />
        <animals key="house" workers="no" vacation="no" />
    </zoodid>'

DECLARE @XML XML
SELECT @XML = 
    REPLACE(
          REPLACE(@YourXML, 'zooid=', 'zooid id=')
        , '</zoodid>'
        , '</zooid>')

SELECT 
      d.[Key]
    , Dogs = MAX(d.Dogs)
    , Zebras = MAX(d.Zebras)
    , Birds = MAX(d.Birds)
    , Workers = MAX(d.Workers)
    , Vacation = MAX(d.Vacation)
FROM (
    SELECT 
          [Key] = t.p.value('./@key', 'NVARCHAR(50)')
        , Zebras = t.p.value('./@zebras', 'INT')
        , Dogs = t.p.value('./@dogs', 'INT')
        , Birds = t.p.value('./@birds', 'INT')
        , Workers = t.p.value('./@workers', 'NVARCHAR(20)')
        , Vacation = t.p.value('./@vacation', 'NVARCHAR(20)')
    FROM @XML.nodes('/zooid/animals') t(p)
) d
GROUP BY d.[Key]
于 2013-04-24T05:50:46.160 に答える