0

データベース内の多数のエンティティのxmlを生成するストアドプロシージャがあります。私はそれを書きませんでした、そして、書いた人はその日家に帰りました、それで私は立ち往生していて助けを必要としています。

生成されるxmlは次のようになります。

<Updates>
   <Update>....stuff....</Update>
   <Update>....stuff....</Update>
   <Update>....stuff....</Update>
   <Update>....stuff....</Update>
</Updates>

私はそれがこのように見える必要があります:

<Updates>
   <CommentUpdate>....stuff....</CommentUpdate>
   <AttachmentUpdate>....stuff....</AttachmentUpdate>
   <CommentUpdate>....stuff....</CommentUpdate>
   <OtherTypeOfUpdate>....stuff....</OtherTypeOfUpdate>
</Updates>

特定の列の値によって異なります。現在、このxmlを生成するストアドプロシージャの部分は次のとおりです。

   (select 
    u.ID as '@ID',
    u.CreatedDate as '@CreatedDate',
    (select * 
    from dbo.fsn_GetUserRef(u.CreatedBy, 
          case when @RetDepth = 'COMPLETE' 
           THEN 'FULL' 
           ELSE '' END) CreatedBy
    for xml auto, type),
    u.Type as 'Type',
    u.Text as 'Text',
    u.DocumentId as 'DocumentId'    
   from fusion_Updates u
   where u.atom_id=atom.ID
   for xml path('Update'), root('Updates'), type),

ヘルプ?

4

1 に答える 1

0

異なる子を持つSQLXMLパスの質問に対する答えには、あなたのために働くはずの解決策が含まれています。

指定したクエリによって返されるデータの構造を完全には理解していません。したがって、より単純な構造の例を示します。ニーズに合わせて調整できるはずです。

、、、およびの列を持つテーブルがあるとすると、UpdateEvent次のクエリで必要なものが得られます。UpdateEventKeyEventDateTimeUpdateType

テーブルは、レコードノードで変数タグ名を生成するための外部選択とフィールドノードを生成するための副選択で2回使用されていることに注意してください。また、PATH('')レコードノードを省略するために使用されます(これは外部選択ですでに生成されているため)。

CREATE TABLE UpdateEvent (
        UpdateEventKey INT,
        EventDateTime DATETIME,
        UpdateType VARCHAR(50)
        );
INSERT INTO UpdateEvent (UpdateEventKey, EventDateTime, UpdateType)
        VALUES (1, GETDATE(), 'Comment');
INSERT INTO UpdateEvent (UpdateEventKey, EventDateTime, UpdateType)
        VALUES (2, GETDATE() + (1 / 1440.0), 'Attachment');
INSERT INTO UpdateEvent (UpdateEventKey, EventDateTime, UpdateType)
        VALUES (3, GETDATE() + (2 / 1440.0), 'Comment');
INSERT INTO UpdateEvent (UpdateEventKey, EventDateTime, UpdateType)
        VALUES (4, GETDATE() + (3 / 1440.0), 'OtherTypeOf');

SELECT CAST('<' + U1.UpdateType + 'Update>'
        + (SELECT * FROM UpdateEvent AS U2
                    WHERE U2.UpdateEventKey = U1.UpdateEventKey FOR XML PATH(''))
        + '</' + U1.UpdateType + 'Update>' AS XML)
        FROM UpdateEvent AS U1 FOR XML PATH(''), ROOT('Updates'), TYPE;

これにより、次のXMLが生成されます。

<Updates>
    <CommentUpdate>
        <UpdateEventKey>1</UpdateEventKey>
        <EventDateTime>2013-02-14T20:32:41.803</EventDateTime>
        <UpdateType>Comment</UpdateType>
    </CommentUpdate>
    <AttachmentUpdate>
        <UpdateEventKey>2</UpdateEventKey>
        <EventDateTime>2013-02-14T20:33:41.767</EventDateTime>
        <UpdateType>Attachment</UpdateType>
    </AttachmentUpdate>
    <CommentUpdate>
        <UpdateEventKey>3</UpdateEventKey>
        <EventDateTime>2013-02-14T20:34:41.727</EventDateTime>
        <UpdateType>Comment</UpdateType>
    </CommentUpdate>
    <OtherTypeOfUpdate>
        <UpdateEventKey>4</UpdateEventKey>
        <EventDateTime>2013-02-14T20:35:41.777</EventDateTime>
        <UpdateType>OtherTypeOf</UpdateType>
    </OtherTypeOfUpdate>
</Updates>
于 2013-02-15T01:30:34.040 に答える