表A,有很多字段,当其中的任何字段被修改时,我需要将被修改前的值记录下来,以便查询修改记录。有以下该当可以实现
INSERT INTO IP_Dev_ChangeBak Select * FROM Deleted;
但这会将所字段保存下来,很浪费空间,我只想保存被修改的字段,不修改的字段置空。怎么实现呢,用update()一个字段一个字段地检查,代码太长了,我的表有50多个字段啊。

解决方案 »

  1.   

    用inserted/deleted主健关联处理如:以ID为主健INSERT INTO IP_Dev_ChangeBak 
    Select d.ID,
    Col1=case when d.Col1=i.Col1 then '' else d.Col1 end,
    Col1=case when d.Col2=i.Col2 then '' else d.Col2 end
     FROM Deleted as d inner join inserted i on d.ID=i.ID
      

  2.   

    是方法,不过要列举所有列,比较老为,发现过函数,COLUMNS_UPDATED,好像也比较复杂
      

  3.   

    declare @newcusts table
    (
    customerid Nchar(5) not null primary key,
    keycol int not null unique
    );
    insert into dbo.customerdim(customerid,companyname)
    output inserted.customerid,inserted.keycol
    into @newcustssql2005新功能. @newcusts 表变量可以是一张表..
    output 出去的可以是所有列也可以是任意一列.
      

  4.   


    用COLUMNS_UPDATED也是等同一列判断,以8列为一个单位计算在这里不适用你的值需要一列列判断是否应该赋值,用inserted/deleted是最省事的