sql-server - while循环在触发器内循环遍历sql中表的所有列

标签 sql-server tsql triggers

我在用户表上有一个如下所示的触发器,可以将更新的列和以前的值插入审计表中:

ALTER TRIGGER [dbo].[trgAfterUpdate] ON [dbo].[tbl_User]
AFTER UPDATE
AS


    declare @fieldname varchar(128) ;
    declare @OldValue varchar(255);
    declare @CreateUser varchar(100) ;
    declare @User_Key int;

    select @CreateUser =i.user_name from deleted i; 
    SELECT @User_Key = i.user_key from inserted i;  

    if update(user_name)
      begin
          select @OldValue=j.user_name from deleted j;  
          set @fieldname = 'user_name';

            insert into tbl_Audit(user_key, field_name, previuos_Value, user_name)
            values(@User_Key ,@fieldname,@OldValue, @CreateUser);

      end

但我的问题是我的 table 上有大约 100 个字段。我写不出100个if条件。我需要一个建议,如何在其中使用 while 循环,以及它将如何影响性能。

谢谢

最佳答案

试试这个 -

ALTER TRIGGER [dbo].[trgAfterUpdate] 

    ON [dbo].[tbl_User]
    AFTER UPDATE

AS BEGIN

    SET NOCOUNT ON
    SET XACT_ABORT ON

    DECLARE @DocumentUID UNIQUEIDENTIFIER

    DECLARE cur CURSOR FORWARD_ONLY READ_ONLY LOCAL FOR
        SELECT DocumentUID, ...
        FROM INSERTED

    OPEN cur

    FETCH NEXT FROM cur INTO @DocumentUID, ...

    WHILE @@FETCH_STATUS = 0 BEGIN

        DECLARE 
              @BeforeChange XML 
            , @AfterChange XML

        SELECT @BeforeChange = (
            SELECT *
            FROM DELETED
            WHERE [DocumentUID] = @DocumentUID
            FOR XML RAW, ROOT
        )
        , @AfterChange = (
            SELECT *
            FROM INSERTED
            WHERE [DocumentUID] = @DocumentUID
            FOR XML RAW, ROOT
        )

        INSERT INTO dbo.LogUser (DocumentUID, BeforeChange, AfterChange)
        SELECT @DocumentUID, @BeforeChange, @AfterChange

        -- your business logic 

        FETCH NEXT FROM cur INTO @DocumentUID, ...

    END

    CLOSE cur
    DEALLOCATE cur

END

关于sql-server - while循环在触发器内循环遍历sql中表的所有列,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17050959/

相关文章:

sql - 在 SQL Server 中连接 2 个表

SQL Server 替换不在范围内的字符

sql - 在子查询中访问别名

sql - 自定义排序顺序 - 如何不重复 Case 语句

SQL 日期比较仅使用日期而不是时间

MySQL - 将 AUTO_INCRMENT 的值分配给表中的另一列

sql-server - 触发器是否有 THISROW 对象

sql-server - SQL Server - Management Studio - 客户端统计 - 服务器回复等待时间与客户端处理时间

sql - 如何在 T-SQL 中创建 If-Then-Else

sql-server - 在 SQL Server 中创建比较日期的触发器