加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

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

发布时间:2020-12-12 06:51:19 所属栏目:MsSql教程 来源:网络整理
导读:我在用户表上有一个类似下面的触发器,用于插入审计表,更新了哪个列和之前的值: ALTER TRIGGER [dbo].[trgAfterUpdate] ON [dbo].[tbl_User]AFTER UPDATEAS declare @fieldname varchar(128) ; declare @OldValue varchar(255); declare @CreateUser varchar(
我在用户表上有一个类似下面的触发器,用于插入审计表,更新了哪个列和之前的值:
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

但我的问题是我在桌子上有100个字段.如果条件,我不能写100.我需要一个如何在其中使用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

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读