2012-09-04 11 views
11

Ho un numero di tabelle nel mio database. Ciascuna di queste tabelle ha un trigger che si attiva in caso di aggiornamento o eliminazione per registrare le modifiche in una tabella AuditLog. La tabella AuditLog contiene:Come posso aggiungere un attributo all'elemento root di xml generato da SQL Select per xml

Id (PK, int non nullo) Action (nchar (1), non nullo) ActionDate (datetime, non nullo) ActionUser (nvarchar (100), non nullo) AuditData (. XML(), non nullo)

Nel mio grilletto, sto facendo qualcosa di simile al seguente:

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 

Questa grande opera, tuttavia, quello che mi piacerebbe fare è aggiungere un attributo all'elemento Root di tablename in modo che l'xml di AuditData assomigli a qualcosa:

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

C'è un modo per farlo con la selezione da ... per la dichiarazione xml?

risposta

18

Prendendo l'aiuto di this filo, sono stato in grado di venire con questo e sembra funzionare:

select 'Person' as "@tableName", 
(select * from deleted for xml path('DataItem'), type) 
for xml path('Root') 
Problemi correlati