深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数
概述
COLUMNS_UPDATED函数能够出现在INSERT或UPDATE触发器中AS关键字后的任何位置,用来指示表或视图中有哪些列已被插入或者更新。它通常和IF语句一起使用,从而可以根据不同的结果,促使触发器执行不同的操作。因此在DML触发器中,COLUMNS_UPDATED函数是一个非常重要且有用的函数。
不同于UPDATE函数,COLUMNS_UPDATED函数可以工作在多个列中,它使用字节中的位(Bit)标识列是否已被修改(也就是采用二进制的方式),而不是在参数中传递列名。我们都知道,1字节(BYTE)=8比特(Bit),因此仅仅使用COLUMNS_UPDATED函数,则只能够标识一个表或视图的前八列是否被修改。如果表的列多于八列,那么必须和SUBSTRING函数一起搭配使用,这将在后文中进行详细讨论。
对COLUMNS_UPDATED函数的原理分析
COLUMNS_UPDATED函数返回类型为varbinary,这是一种二进制类型,它可以表示一个或多个字节,用来映射相关联表的列。因此COLUMNS_UPDATED函数返回一个或多个由左向右排序的字节,这取决于要验证更新的表是否拥有八个以上的列。最左侧字节表示列的序号为1至8的列,越偏向右侧的字节,其所代表的列的序号也就越大。而列序号的排序是在创建表时,由列被定义的顺序所决定的。在每个字节的内部,越偏向左侧,列的序号越大,而左侧字节所代表的列的序号总小于右侧字节的。请允许我用一个简单的示例来阐述上述过程:
我们假设有一张表TriggerDemo,它拥有24个列,分别为COL1、COL2、COL3直至COL24。那么COLUMNS_UPDATED函数就会返回3个字节,在最左侧的字节内由右向左表示COL1至COL8,中间的字节内由右向左表示COL9至COL16,最右侧的字节内由右向左表示COL17至COL24。
正如我之前所说,1字节中的8比特就可以表示一张表的前八列,如果某一位为1,那么它所表示的列被标记为已更新。反之为0,那么就是未更新。如果多个列被更新,那么就会存在有多个位被设置为1的情况。例如00001010就表示第二列和第四列已经被更新。
使用COLUMNS_UPDATED函数测试前八列
对于位(Bit)要说的是,第一个位称为Bit0(而不是Bit1),因此1个字节是由Bit0至Bit7共八个位所组成的。有几个列被更新,COLUMNS_UPDATED函数就会返回一个所对应的位设置为1的字节。如果我们要想知道第二列和第四列是否被更新,就应该构造出一个字节,并将Bit1和Bit3设置为1(00001010),然后需要将这个字节转换成十进制10,再和COLUMNS_UPDATED函数返回的字节进行按位逻辑与(&)操作,&运算的结果如果是10,就能够保证第二列和第四列已经同时被更新。再结合使用不同的比较运算符(<、>、=),处理各种各样的可能性,你就会真切体会到COLUMNS_UPDATED函数的功能是多么的强大了。好了,为了便于理解,请看一个完整的代码演示:
CREATE TRIGGER updDataTrigger
ON TriggerDemo
AFTER UPDATE AS
--测试第二列和第四列是否被同时更新
IF COLUMNS_UPDATED() & 10 =10
BEGIN
…………
END
--是否第二列或者第四列或者第二列和第四列同时被更新
ELSE IF COLUMNS_UPDATED() & 10 > 0 AND COLUMNS_UPDATED()&10<=10
BEGIN
…………
END
--测试第二列或者第四列是否已被更新
ELSE IF COLUMNS_UPDATED() & 10 <10 AND COLUMNS_UPDATED() & 10>0
BEGIN
…………
END
使用COLUMNS_UPDATED函数测试八个以上的列
一旦表拥有八个以上的列,COLUMNS_UPDATED函数将会返回多个字节。这时我们就需要借助SUBSTRING函数来截取一个特定的字节,它可以从COLUMNS_UPDATED函数返回的多个字节中任意截取一个我们所想要的。
还记得我们前面的那张虚拟表TriggerDemo吗?(就是拥有24个列的那个) 如果我们想测试它的第二列、第十列以及第二十四列是否已被更新,我们就需要使用SUBSTRING函数来截取到分别代表这些列的字节,再重复前面测试前八列方法的步骤。我们参见一下代码:
--测试第二列、第十列以及第二十四列是否同时被更新
IF(SUBSTRING(COLUMNS_UPDATED(),1,1)&2=2)
AND (SUBSTRING(COLUMNS_UPDATED(),2,1)&2=2)
AND(SUBSTRING(COLUMNS_UPDATED(),3,1)&128=128)
BEGIN
…………
END
总结
本文详细讲解了该如何使用COLUMNS_UPDATED函数,首先介绍了它的基本工作原理,然后对于测试前八列和八个以上的列这两种情况,详述了运用COLUMNS_UPDATED函数的两种不同方法。为了便于理解它的功能强大,还插入了相关的代码片段和引入了一个虚拟的表TriggerDemo。通过这种方式,我们就能够深刻体会到为什么它是UPDATE触发器必不可少的助手。最后祝愿大家编程愉快。
转载于:https://www.cnblogs.com/jilleanwong/archive/2008/09/01/1280890.html
深入理解SQL Server 2005 中的 COLUMNS_UPDATED函数相关推荐
- Sql server 2005 中的dense_rank()函数的应用
sql server 2005 排名提供dense_rank() 函数.实现起来非常简单. 示例如下: declare @t table(place int,score int) insert int ...
- 打破第一范式的要求 (中英对照)Michael Rys 对 SQL Server 2005 中XML 的 评论——对微软SQL Server项目经理Michael Rys博士的采访
Michael Rys on XML in SQL Server 2005 Michael Rys对SQL Server 2005中XML的评论 Michael Rys is one of two p ...
- SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?
如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...
- SQL Server 2005中的Row_Number分页
早就听说了SQL Server 2005中的Row_Number分页了,但是一直就没认真理解这个Row_Number的含义.这两天实在是太忙了,但是还是坚持将这个弄明白了.在说分页之前还是来了解一下R ...
- SQL Server 2005 中的商务智能和数据仓库
微软发布了SQL Server 2005,对于微软与BI来说这是一个非常重要的版本,它完善了微软在BI方面的产品线.SQL Server 2005以及 Visual Studio .net2005的整 ...
- 使用 SQL Server 2005中的 CLR 集成
Balaji Rathakrishnan Christian Kleinerman Brad Richards Ramachandran Venkatesh Vineet Rao Microsoft ...
- SQL Server 2005中解决死锁问题
SQL Server 2005中解决死锁问题 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面 ...
- SQL Server 2005中的分析服务功能[转]
XXXX(不知道为什么CnBlogs上的人这么抵制XXXX,呵呵--)上推出了"体验SQL Server 2005"活动,当然啦,一些关于SQL Server 2005的文章被翻译 ...
- Sql Server 2005 中的row_number() 分页技术
原文发布时间为:2009-05-08 -- 来源于本人的百度文章 [由搬家工具导入] 在Sql Server 2005中,我们可以利用新增函数row_number()来更高效的实现分页存储 CREAT ...
最新文章
- 双11个性化推荐背后,阿里云“舜天”如何应对百亿次挑战?
- python32bit改64bit,从32位Python更改64位注册表
- ZPhotoEngine超级算法库
- 基于FPGrowth挖掘算法的乳腺癌中医症型关联规则挖掘
- gensim中文处理
- SAP ERP classification和C4C的同步
- 这位电子工程师,你不能错过。
- 量化投资之定投,无脑却收益还不错,记得周三来
- SQL 数据库远程备份 语句
- 模板:多项式乘法(FFTNTT)
- Unity2020.1中如何安装DOTS的Entities包?
- pycharm导入本地文件,程序运行正常,但导入模块时出现红色波浪线
- Failed to execute goal com.github.wvengen:proguard-maven-plugin:2.0.10:proguard (default) on project
- Julia: Array 很不同!
- SQL Server2008安装教程
- ACT开发初步(二)——XML
- Keil下载代码闪退的问题(已解决)
- LiteIDE主题定制教程【续】
- MLX90614使用和组装的说明
- 利用Karabiner和键盘修饰键修改MAC键盘,实现打字时双手不离开字母和数字区
热门文章
- 动态可订制属性的 PropertyGrid(转载)
- 老李案例分享:Weblogic性能优化案例
- 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
- android开发之-软件设置保存-快速学会使用SharedPreferences篇-实测
- Angular 一个简单的指令实现 阻止事件扩散
- MyEclipse中jsp编码设置
- mysql 性能剖析-profiles
- [计算机视觉][神经网络与深度学习]Faster R-CNN配置及其训练教程
- tcp协议头窗口,滑动窗口,流控制,拥塞控制关系
- Java并发编程 LockSupport源码分析