概述

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函数相关推荐

  1. Sql server 2005 中的dense_rank()函数的应用

    sql server 2005 排名提供dense_rank() 函数.实现起来非常简单. 示例如下: declare @t table(place int,score int) insert int ...

  2. 打破第一范式的要求 (中英对照)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 ...

  3. SQL Server 2005中的分区表(一):什么是分区表?为什么要用分区表?如何创建分区表?

    如果你的数据库中某一个表中的数据满足以下几个条件,那么你就要考虑创建分区表了. 1.数据库中某个表中的数据很多.很多是什么概念?一万条?两万条?还是十万条.一百万条?这个,我觉得是仁者见仁.智者见智的 ...

  4. SQL Server 2005中的Row_Number分页

    早就听说了SQL Server 2005中的Row_Number分页了,但是一直就没认真理解这个Row_Number的含义.这两天实在是太忙了,但是还是坚持将这个弄明白了.在说分页之前还是来了解一下R ...

  5. SQL Server 2005 中的商务智能和数据仓库

    微软发布了SQL Server 2005,对于微软与BI来说这是一个非常重要的版本,它完善了微软在BI方面的产品线.SQL Server 2005以及 Visual Studio .net2005的整 ...

  6. 使用 SQL Server 2005中的 CLR 集成

    Balaji Rathakrishnan Christian Kleinerman Brad Richards Ramachandran Venkatesh Vineet Rao Microsoft ...

  7. SQL Server 2005中解决死锁问题

    SQL Server 2005中解决死锁问题 数据库操作的死锁是不可避免的,本文并不打算讨论死锁如何产生,重点在于解决死锁,通过SQL Server 2005, 现在似乎有了一种新的解决办法. 将下面 ...

  8. SQL Server 2005中的分析服务功能[转]

    XXXX(不知道为什么CnBlogs上的人这么抵制XXXX,呵呵--)上推出了"体验SQL Server 2005"活动,当然啦,一些关于SQL Server 2005的文章被翻译 ...

  9. Sql Server 2005 中的row_number() 分页技术

    原文发布时间为:2009-05-08 -- 来源于本人的百度文章 [由搬家工具导入] 在Sql Server 2005中,我们可以利用新增函数row_number()来更高效的实现分页存储 CREAT ...

最新文章

  1. 双11个性化推荐背后,阿里云“舜天”如何应对百亿次挑战?
  2. python32bit改64bit,从32位Python更改64位注册表
  3. ZPhotoEngine超级算法库
  4. 基于FPGrowth挖掘算法的乳腺癌中医症型关联规则挖掘
  5. gensim中文处理
  6. SAP ERP classification和C4C的同步
  7. 这位电子工程师,你不能错过。
  8. 量化投资之定投,无脑却收益还不错,记得周三来
  9. SQL 数据库远程备份 语句
  10. 模板:多项式乘法(FFTNTT)
  11. Unity2020.1中如何安装DOTS的Entities包?
  12. pycharm导入本地文件,程序运行正常,但导入模块时出现红色波浪线
  13. Failed to execute goal com.github.wvengen:proguard-maven-plugin:2.0.10:proguard (default) on project
  14. Julia: Array 很不同!
  15. SQL Server2008安装教程
  16. ACT开发初步(二)——XML
  17. Keil下载代码闪退的问题(已解决)
  18. LiteIDE主题定制教程【续】
  19. MLX90614使用和组装的说明
  20. 利用Karabiner和键盘修饰键修改MAC键盘,实现打字时双手不离开字母和数字区

热门文章

  1. 动态可订制属性的 PropertyGrid(转载)
  2. 老李案例分享:Weblogic性能优化案例
  3. 用SignalR 2.0开发客服系统[系列3:实现点对点通讯]
  4. android开发之-软件设置保存-快速学会使用SharedPreferences篇-实测
  5. Angular 一个简单的指令实现 阻止事件扩散
  6. MyEclipse中jsp编码设置
  7. mysql 性能剖析-profiles
  8. [计算机视觉][神经网络与深度学习]Faster R-CNN配置及其训练教程
  9. tcp协议头窗口,滑动窗口,流控制,拥塞控制关系
  10. Java并发编程 LockSupport源码分析