sql下Trigger中的COLUMNS_updated

Trigger中的COLUMNS_updated用法
    Trigger中,UPDATED(column)判断一个字段是否更新,而COLUMNS_updated可以判断多个字段,如下(ZT和SQL SERVER联机丛书)
    1)仅用于insert,update触发器中.
    2)指定的所有列是否都进行了更新,使用等号(=).
    3)指定的任一列或某些列是否进行了更新,使用大于号(>)
例子:
    有一表T,其包含五列:C1,C2,C3,C4,C5(注意:由左到右数过来),
    如要检查C2,C3,C4是否全部进行了更新,则:IF (COLUMNS_updateD(T)&14=14)
    如要检查C2,C3,C4是否某一列进行了更新,则:IF (COLUMNS_updateD(T)&14>14)
以上例子14的由来
    首先,标记需要检查是否更新的列值为1,否则为0,如下式所示:
         C1---C2---C3---C4---C5
         0----1-----1----1----0
由上可得:C4 C3 C2 C1:1110(注意:有右到左列出来),此值为二进制,转换为十进制,则得出14

同一例子,如要检查C2是否进行了更新,则C2 C1:10,二进制10的十进制为2,所以结果为:
   IF (COLUMNS_updateD(T)&2=2)    或者:   IF update(C2)

四.IF (COLUMNS_UPDATED()) 测试是否插入或更新了提及的列,仅用于 INSERT 或 UPDATE 触发器中。COLUMNS_UPDATED 返回
    varbinary 位模式,表示插入或更新了表中的哪些列。

    COLUMNS_UPDATED 函数以从左到右的顺序返回位,最左边的为最不重要的位。最左边的位表示表中的第一列;向右的下一位表示第二列,

依此类推。如果在表上创建的触发器包含 8 列以上,则 COLUMNS_UPDATED 返回多个字节,最左边的为最不重要的字节。在 INSERT 操作中

COLUMNS_UPDATED 将对所有列返回 TRUE 值,因为这些列插入了显式值或隐性 (NULL) 值。可以在触发器主体中的任意位置使用

COLUMNS_UPDATED

五.使用 COLUMNS_UPDATED 测试 8 列以上<来自联机从书>
   如果必须测试影响到表中前 8 列以外的列的更新时,必须使用 SUBSTRING 函数测试由 COLUMNS_UPDATED 返回的适当的位。下例测试影响

Northwind.dbo.Customers 表中的第 3、第 5 或第 9 列的更新。
USE Northwind
DROP TRIGGER   tr1
GO
CREATE TRIGGER tr1 ON Customers
FOR UPDATE AS
    IF ( (SUBSTRING(COLUMNS_UPDATED(),1,1)=power(2,(3-1))
       + power(2,(5-1))) 
       AND (SUBSTRING(COLUMNS_UPDATED(),2,1)=power(2,(1-1)))) 
    PRINT 'Columns 3, 5 and 9 updated'
GO

UPDATE Customers 
    SET ContactName=ContactName,
       Address=Address,
       Country=Country
GO
附:
SUBSTRING ( expression , start , length )
参数
expression   是字符串、二进制字符串、text、image、列或包含列的表达式。不要使用包含聚合函数的表达式。
start   是一个整数,指定子串的开始位置。
length   是一个整数,指定子串的长度(要返回的字符数或字节数)。

POWER 返回给定表达式乘指定次方的值。
语法   POWER ( numeric_expression , y )
参数
numeric_expression 是精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。
y numeric_expression 的次方。y 可以是精确数字或近似数字数据类型类别的表达式(bit 数据类型除外)。
返回类型 与 numeric_expression 相同。

六.求在有重复名称记录中找最小编码的SQL语句
    有如下表:
BM          MC 
001         t1  
001         t1      
002         t2        
003         t2                
003         t3        
004         t3  
需要的结果为:
001         t1        
002         t2                
003         t3 
T-SQL如下:
   SELECT MIN(BM), MC FROM [TABLE] WHERE MC IN (SELECT MC FROM [TABLE] GROUP BY MC) GROUP BY MC
下面语句在此例中得到相同结果,不知是否满足要求:  
   select   min(bm), mc   from   [table]   group   by   mc
?当GROUP BY后,MIN是一聚合函数,先将MC分组,再求出各分组中BM最小值,如果没有排序,还可以先排序,可否? 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值