加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > MsSql教程 > 正文

SQL Server更新触发器,仅获取修改的字段

发布时间:2020-12-12 16:38:59 所属栏目:MsSql教程 来源:网络整理
导读:我知道COLUMNS_UPDATED,我需要一些快捷的快捷方式(如果有人做过,我已经做了一个,但是如果有人可以节省我的时间,我会加以评价) 我需要基本的只有更新的列值的XML,我需要这个复制目的. SELECT * FROM inserted给了我每列,但我只需要更新的列. 像以下的东西 CREA
我知道COLUMNS_UPDATED,我需要一些快捷的快捷方式(如果有人做过,我已经做了一个,但是如果有人可以节省我的时间,我会加以评价)

我需要基本的只有更新的列值的XML,我需要这个复制目的.

SELECT * FROM inserted给了我每列,但我只需要更新的列.

像以下的东西

CREATE TRIGGER DBCustomers_Insert
    ON DBCustomers
    AFTER UPDATE
AS
BEGIN
    DECLARE @sql as NVARCHAR(1024);
    SET @sql = 'SELECT ';


    I NEED HELP FOR FOLLOWING LINE ....,I can manually write every column,but I need 
    an automated routin which can work regardless of column specification
    for each column,if its modified append $sql = ',' + columnname...

    SET @sql = $sql + ' FROM inserted FOR XML RAW';

    DECLARE @x as XML;
    SET @x = CAST(EXEC(@sql) AS XML);


    .. use @x

END

解决方法

在触发器内部,您可以使用这样的COLUMNS_UPDATED()来获取更新的值
-- Get the table id of the trigger
--
DECLARE @idTable      INT

SELECT  @idTable = T.id 
FROM    sysobjects P JOIN sysobjects T ON P.parent_obj = T.id 
WHERE   P.id = @@procid

-- Get COLUMNS_UPDATED if update
--
DECLARE @Columns_Updated VARCHAR(50)

SELECT  @Columns_Updated = ISNULL(@Columns_Updated + ',','') + name 
FROM    syscolumns 
WHERE   id = @idTable   
AND     CONVERT(VARBINARY,REVERSE(COLUMNS_UPDATED())) & POWER(CONVERT(BIGINT,2),colorder - 1) > 0

但是当您有一个具有超过62列的表时,这个代码的代码会失败.Arth.Overflow …

这是处理超过62列但只提供更新列数的最终版本.很容易与’syscolumns’链接来获取名称

DECLARE @Columns_Updated VARCHAR(100)
SET     @Columns_Updated = ''   

DECLARE @maxByteCU INT
DECLARE @curByteCU INT
SELECT  @maxByteCU = DATALENGTH(COLUMNS_UPDATED()),@curByteCU = 1

WHILE @curByteCU <= @maxByteCU BEGIN
    DECLARE @cByte INT
    SET     @cByte = SUBSTRING(COLUMNS_UPDATED(),@curByteCU,1)

    DECLARE @curBit INT
    DECLARE @maxBit INT
    SELECT  @curBit = 1,@maxBit = 8
    WHILE @curBit <= @maxBit BEGIN
        IF CONVERT(BIT,@cByte & POWER(2,@curBit - 1)) <> 0 
            SET @Columns_Updated = @Columns_Updated + '[' + CONVERT(VARCHAR,8 * (@curByteCU - 1) + @curBit) + ']'
        SET @curBit = @curBit + 1
    END
    SET @curByteCU = @curByteCU + 1
END

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读