对COLUMNS_UPDATED()返回值的解析

<script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>

需求来源:
客户要求[某些特定的表]能[自定义预警报告].

(在特定的表上)用户可定义某些字段有修改时,向有关用户发出消息警报<内容大致是 xx单据的xx单号的xx字段由old变为了new>.最终目的是由消息控制模块向消息接收人报告这一变更.

基础知识:
COLUMNS_ UPDATED()是一个仅可在InsertorUpdatetrigger中调用的方法.
该方法返回一个varbinary的值,存储了当次Insert或是Update触发器所对应的记录在哪些字段上发生了Inserted or UPDATED.在SQLSERVER 的联机帮助[CREATETRIGGER]和[IFUPDATE]中有对 COLUMNS_ UPDATED()方法的简要描述.

公司要求用Trigger实现:(为每个[特定的表]编写一个特定的UPDATE触发器.)
主要难点是穷举IFUPDATE(column)的方法不可行.其他业务实现无问题.
后来仔细琢磨 COLUMNS_ UPDATED()所返回的值,问题得到解决.

这裡只是讲述对 COLUMNS_ UPDATED()所返回的值的 解析和运用.就不考虑用户指定变更字段及插入记录到消息表的那部分实现过程了.

--测试数据準备.

Ifexists(select*fromsysobjectswhereid=object_id(N'[dbo].[T_Test]')andxtype='u')
  DROPTableT_Test
go

CREATE Table T_Test(
f_id    int IDENTITY(1,1)PrimaryKey,
f_char    Char(8)default'',
f_varchar   varchar(8)default'',
f_nvarchar   nvarchar(8)default'',
f_datetime   datetimedefaultgetdate(),
f_int    intdefault0,
f_bigint   bigintdefault0,
f_decimal   decimal(18,6)default0.00,
f_number   numeric(18,6)default0.00,
f_float    floatdefault0.00
)
go

INSERTINTOT_Test(f_char)values('001')
INSERTINTOT_Test(f_char)values('002')
go


--编写Update触发器

If exists(select*fromsysobjectswhereid=object_id(N'[dbo].[Tri_Test_Upd]')andobjectproperty(id,N'istrigger')=1)
   DROPTRIGGERTri_Test_Upd
go

CREATE TRIGGERTri_Test_UpdONT_Test --WITHENCRYPTION
FOR UPDATE
AS
DECLARE @iRowCnt INT

SET @iRowCnt=@@rowcount

IF @iRowCnt<1
 RETURN

DECLARE
  @sTable  VARCHAR(128),
  @sPKName VARCHAR(32),
  @sColName VARCHAR(128)

DECLARE
  @iColCnt  INT,
  @iColId  INT

DECLARE
  @i    TINYINT,
  @j    TINYINT,
  @iSegment TINYINT,
  @iVal   TINYINT,
  @iLog2  TINYINT

DECLARE
  @sSQL  VARCHAR(8000)

SET @sTable='t_test'
SET @sPKName='f_id'

-- 求得当前表列个数
SELECT @iColCnt=Count(1)FROMsys COLUMNS WHEREid=object_id(@sTable)

-- 以8个字段为一小段
SET @iSegment=CASE
       WHEN@iColCnt/8=@iColCnt/8.0
        THEN
         @iColCnt/8
        ELSE
         @iColCnt/8+1
        END 1 <script type="text/javascript"> </script> <script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
<script type="text/javascript"> </script><script type="text/javascript" src="http://pagead2.googlesyndication.com/pagead/show_ads.js"> </script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值