触发器如下:ALTER       TRIGGER [TR_最后到帐月更新_TR] ON [DBO].[个人参保信息表]
FOR UPDATE,INSERT 
AS
BEGIN
DECLARE @DAYS INT --黑名单生效天数
SET @DAYS = 60 --黑名单生效默认为60天
SELECT @DAYS = Convert( int,isnull(参数当前值,0) ) FROM dbo.常用参数表 WHERE 参数序号=122 --从参数表取黑名单生效天数 IF ( COLUMNS_UPDATED()&16 > 0 ) --修改最后到帐月列 或 增加一条记录
BEGIN
DELETE 医保黑名单 WHERE 医保证号 IN ( SELECT 医保证号 FROM inserted WHERE 参保险种代码='00010001' AND DATEDIFF(DAY,最后到帐月,GETDATE())<=@DAYS )
END
END实现功能就是,个人参保信息表 第 5 列 最后到帐月 修改为 大于等于(当前日期-60天)时,将指定参保人从 医保黑名单 表中删除-----这个人缴费了就从黑名单里删除他在 SQL2000里,程序一切正常;换到 SQL2005 就不能正常执行,我怀疑 SQL2005 里被修改的行是不是不存在inserted里,请高手指点迷津!!!

解决方案 »

  1.   

    再好好测试一下,应该不会“SQL2005 里被修改的行是不是不存在inserted里”
      

  2.   

    TO:fxf66() 谢谢
    你用过 SQL2005,确信 被修改行 也是存在 inserted 表中吗?
      

  3.   

    create table test(a int,b int)
    insert into test select 1,2
    union all select 1,3
    union all select 2,3
    union all select 1,23
    union all select 21,23create trigger tri_test on test 
    for update
    as
    if update(a)
    begin
    --每一次更新在sql中都可以看成是先删后增.
        select * from deleted--这里存的是删除的记录
        select * from inserted--这里存的是新增的记录
    endupdate test set a=4 where a=21 and b=23
    ----------------用上面的语句测试一下嘛
      

  4.   

    原因找到了
    是否第五列修改在 SQL2000下用
    COLUMNS_UPDATED()&16 > 0在SQL 2005 下用
    COLUMNS_UPDATED()&4096 > 0我也不知道怎么算出来的,但查询 COLUMNS_UPDATED() 的值为 0x1000=2的12次方=4096
    谢谢各位