如何在sql server update语句中查找受影响的列

如何在sql server update语句中查找受影响的列,sql,sql-server,sql-server-2008,Sql,Sql Server,Sql Server 2008,我有一个日志表列,如下所示 [Id] ,[Attribute] ,[Action] ,[OldValue] ,[NEwValue] ,[UserId] ,[ModifiedDate] 其中id表示行id受到影响。属性是受影响的列。操作为“插入”或“更新”,具体取决于执行的操作类型。 在更新旧值的情况下,应将更新列的新值和旧值插入日志表中的新值和旧值列 Wat是实现这一点的最佳方法。我应该选择触发器还是存储过程?是否检查了SQL Server 2008中

我有一个日志表列,如下所示

   [Id]      
  ,[Attribute]
  ,[Action]
  ,[OldValue]
  ,[NEwValue]
  ,[UserId]
  ,[ModifiedDate]
其中id表示行id受到影响。属性是受影响的列。操作为“插入”或“更新”,具体取决于执行的操作类型。 在更新旧值的情况下,应将更新列的新值和旧值插入日志表中的新值和旧值列


Wat是实现这一点的最佳方法。我应该选择触发器还是存储过程?

是否检查了SQL Server 2008中引入的“更改数据捕获”?

是否检查了SQL Server 2008中引入的“更改数据捕获”?

请尝试以下示例代码

-- Temp table to track changes
DECLARE  @tmpTable TABLE
(
     [Id]  INT   IDENTITY(1,1)     
    ,[Attribute]   VARCHAR(10)
    ,[Action]   VARCHAR(50)
    ,[OldValue]   VARCHAR(50)
    ,[NEwValue]   VARCHAR(50)
    ,[UserId]   INT 
    ,[ModifiedDate]  DATETIME

)

-- Actual/Transaction table
DECLARE @tblMyTable TABLE
(
        ID INT IDENTITY(1,1),
        Name VARCHAR(50)
)

-- Sample insert query
INSERT      INTO    @tblMyTable
OUTPUT      'Name'
            ,'Inserted'
            ,NULL -- Old value is null
            ,inserted.Name
            ,1 -- user ID
            ,GETDATE()

INTO        @tmpTable 
VALUES      ('New Name');


-- Sample update query
UPDATE      @tblMyTable
SET         Name = 'Updated Name'
OUTPUT      
            'Name'
            ,'Updated'
            ,deleted.Name -- Old value is null
            ,inserted.Name
            ,1 -- user ID
            ,GETDATE()

INTO        @tmpTable


select * from @tblMyTable
select * from @tmpTable

请尝试以下示例代码

-- Temp table to track changes
DECLARE  @tmpTable TABLE
(
     [Id]  INT   IDENTITY(1,1)     
    ,[Attribute]   VARCHAR(10)
    ,[Action]   VARCHAR(50)
    ,[OldValue]   VARCHAR(50)
    ,[NEwValue]   VARCHAR(50)
    ,[UserId]   INT 
    ,[ModifiedDate]  DATETIME

)

-- Actual/Transaction table
DECLARE @tblMyTable TABLE
(
        ID INT IDENTITY(1,1),
        Name VARCHAR(50)
)

-- Sample insert query
INSERT      INTO    @tblMyTable
OUTPUT      'Name'
            ,'Inserted'
            ,NULL -- Old value is null
            ,inserted.Name
            ,1 -- user ID
            ,GETDATE()

INTO        @tmpTable 
VALUES      ('New Name');


-- Sample update query
UPDATE      @tblMyTable
SET         Name = 'Updated Name'
OUTPUT      
            'Name'
            ,'Updated'
            ,deleted.Name -- Old value is null
            ,inserted.Name
            ,1 -- user ID
            ,GETDATE()

INTO        @tmpTable


select * from @tblMyTable
select * from @tmpTable

我找到了解决方法。在这里发布其他人使用的

 CREATE TRIGGER [dbo].[tb_sample_UpdationTrigger] on [dbo].[tb_sample]  for UPDATE
    as
     if UPDATE(R_Id) 
     insert into dbo.test_log(Attribute,Action,OldValue,NEwValue,UserId,ModifiedDate)
    (SELECT 'R_Id','update', d.R_Id, i.R_Id ,1,GETDATE()
    FROM inserted i
    INNER JOIN deleted d ON d.id=i.id
    INNER JOIN tb_sample ON tb_sample.id=i.id)

我找到了解决方法。在这里发布其他人使用的

 CREATE TRIGGER [dbo].[tb_sample_UpdationTrigger] on [dbo].[tb_sample]  for UPDATE
    as
     if UPDATE(R_Id) 
     insert into dbo.test_log(Attribute,Action,OldValue,NEwValue,UserId,ModifiedDate)
    (SELECT 'R_Id','update', d.R_Id, i.R_Id ,1,GETDATE()
    FROM inserted i
    INNER JOIN deleted d ON d.id=i.id
    INNER JOIN tb_sample ON tb_sample.id=i.id)

触发器对我来说是新的。你可以为此发布更新触发器吗?这样我就可以引用toGo来获取存储过程和使用输出子句。触发器对我来说是新的。你可以为此发布更新触发器吗?这样我就可以引用toGo来获取存储过程和使用输出子句。