2012-09-04 29 views
11

Tengo varias tablas en mi base de datos. Cada una de estas tablas tiene un desencadenador que se activa al actualizar o eliminar para registrar cambios en una tabla AuditLog. La tabla de AuditLog contiene lo siguiente:Cómo puedo agregar un atributo al elemento raíz de xml generado por SQL Seleccionar para xml

Id (PK, int, no nula) Acción (nchar (1), no es nulo) ActionDate (fecha y hora, no nula) ActionUser (nvarchar (100), no es nulo) AuditData (. XML(), no es nulo)

En mi gatillo, que estoy haciendo algo como lo siguiente:

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 

Esto funciona muy bien, sin embargo, lo que me gustaría hacer es agregar un atributo al elemento Root de tablename para que el xml de AuditData se parezca a:

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

¿Hay alguna manera de lograr esto con la selección de ... para la declaración xml?

Respuesta

18

Tomando la ayuda de this hilo, yo era capaz de llegar con esto y parece que funciona:

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