12

データベースにいくつかのテーブルがあります。これらの各テーブルには、AuditLogテーブルへの変更をログに記録するために更新または削除時に起動するトリガーがあります。AuditLogテーブルには次のものが含まれます。

Id(PK、int、not null)Action(nchar(1)、not null)ActionDate(datetime、not null)ActionUser(nvarchar(100)、not null)AuditData(XML(。)、not null)

私のトリガーでは、次のようなことをしています。

DECLARE @auditBody XML
SET @auditBody = (select * from deleted as Root for xml auto, elements)
insert into dbo.AuditLog 
   (Action, ActionDate, ActionUser, AuditData)
   select Case
        When I.Id is not null then 'U'
        Else 'D'
       End as Action
     ,getdate() as ActionDate
     ,suser_name() as ActionUser
     ,@auditBody as AuditData
  From
    deleted D Left Join
    inserted I on D.Id = I.Id

これはうまく機能しますが、私がやりたいのは、AuditDataxmlが次のようになるようにtablenameのRoot要素に属性を追加することです。

<Root tableName = "Person">
    <Id>132</Id>
    <FirstName>Ryan</FirstName>
    ...
</Root>

select from ... for xmlステートメントを使用してこれを実現する方法はありますか?

4

1 に答える 1

23

このスレッドの助けを借りて、私はこれを思い付くことができ、うまくいくようです:

select 'Person' as "@tableName",
 (select * from deleted for xml path('DataItem'), type)
 for xml path('Root')
于 2012-09-04T20:37:14.297 に答える