2012-09-04 4 views
11

データベースに多数のテーブルがあります。これらの各テーブルには、更新または削除時にAuditLogテーブルへの変更を記録するためのトリガがあります。xmlのSQL Selectで生成されたxmlのルート要素に属性を追加するには

ID(PK、int型、NOT NULL) アクション(NCHAR(1)、NOT NULL) ActionDate(日時、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 

これは素晴らしい作品、しかし、私は何をしたいのは、追加でAuditData xmlが次のようになるように、tablenameのRoot要素への属性:

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

select from ... from xmlステートメントでこれを行う方法はありますか?

答えて

18

thisスレッドからの助けを取ると、私はこれを思い付くことができたし、動作しているようです:

select 'Person' as "@tableName", 
(select * from deleted for xml path('DataItem'), type) 
for xml path('Root') 
関連する問題