<rt id="bn8ez"></rt>
<label id="bn8ez"></label>

  • <span id="bn8ez"></span>

    <label id="bn8ez"><meter id="bn8ez"></meter></label>

    追隨Java
    簡單的事情重復(fù)做,就會產(chǎn)生累積效應(yīng)!
    posts - 260,  comments - 338,  trackbacks - 0

    在網(wǎng)上找到了一個類似的文章http://www.cnblogs.com/delphi/articles/121516.html來引用這文章.我在它的基礎(chǔ)上加了更詳細(xì)注解。  如下:          

    CREATE Table T_Test (
    f_id    
    int IDENTITY(11Primary Key,
    f_char    
    Char(8default '',
    f_varchar   
    varchar(8default '',
    f_nvarchar   
    nvarchar(8default '',
    f_datetime   
    datetime default getdate(),
    f_int    
    int default 0,
    f_bigint   
    bigint default 0,
    f_decimal   
    decimal(186default 0.00,
    f_number   numeric(
    186default 0.00,
    f_float    
    float default 0.00
    )
    go

    INSERT INTO T_Test (f_char) values('001')
    INSERT INTO T_Test (f_char) values('002')
    go

    select * from t_test



    If exists(select * from sysobjects where id=object_id(N'[dbo].[Tri_Test_Upd]'and objectproperty(id,N'istrigger')=1)  
       
    DROP TRIGGER Tri_Test_Upd  
    go  
     
    CREATE TRIGGER Tri_Test_Upd ON T_Test --WITH ENCRYPTION  
    FOR UPDATE  
    AS  


    DECLARE @iRowCnt INT  --列數(shù)
     
    SET @iRowCnt = @@rowcount  
     
    IF @iRowCnt < 1  
    RETURN  
     
    DECLARE  
     
    @sTable  VARCHAR(128),  --表名
     @sPKName VARCHAR(32),  --主鍵名
     @sColName VARCHAR(128)  --列名
     
    DECLARE  
     
    @iColCnt  INT,  --列數(shù)
     @iColId  INT  --列id
     
    DECLARE  
     
    @i    TINYINT,  
     
    @j    TINYINT,  
     
    @iSegment TINYINT,  --以8為除數(shù)得余數(shù)(有少個分段)
     @iVal   TINYINT,  --被更新過的字段的十六進(jìn)制值
     @iLog2  TINYINT  
     
    DECLARE  
     
    @sSQL  VARCHAR(8000)  --執(zhí)行的sql
     
    SET @sTable = 't_test'  
    SET @sPKName = 'f_id'  
     
    -- 求得當(dāng)前表列個數(shù)  
    SELECT @iColCnt = Count(1FROM syscolumns WHERE id = object_id(@sTable)  
     
    -- 以8個字段為一小段  
    SET @iSegment = CASE  
          
    WHEN @iColCnt / 8 = @iColCnt / 8.0  --如果列總數(shù)是8的倍數(shù)那就取整數(shù),否則取整數(shù)再加1
           THEN  
            
    @iColCnt / 8  
           
    ELSE  
            
    @iColCnt / 8 + 1  
           
    END  
    -- 將數(shù)據(jù)存入臨時表
    SELECT * INTO #Inserted FROM Inserted  --更新的數(shù)據(jù)
    SELECT * INTO #Deleted FROM Deleted  --更新前的數(shù)據(jù)
     
    --中間處理數(shù)據(jù)用
    CREATE TABLE #Temp(  
      f_PKVal  
    varchar(254not null primary key,  --主鍵
      f_OldVal  varchar(254),  --原來的值
      f_NewVal  varchar(254)  --新的值
    )  
     
    SET @i = 0  --循環(huán)整個分段(也就所有的字段)
     
    WHILE @i < @iSegment  
      
    BEGIN  
     
    --8個字段為一個分區(qū),當(dāng)表的列數(shù)大于8,那么計算被更新過的字段的十六進(jìn)制值方法不同
     IF @iColCnt < 9  --表的列數(shù)小于8
       SET @iVal= COLUMNS_UPDATED()  
     
    ELSE  --表的列數(shù)大于8
       SET @iVal= SubString(COLUMNS_UPDATED(), @i + 11)  
      
     
    --等于零,則表示當(dāng)前小節(jié)所對應(yīng)的8個字段沒有被更新(修改)過,中止本次循環(huán),繼續(xù)下一次循環(huán)
     IF @iVal = 0  
      
    BEGIN  
        
    SET @i = @i + 1  
        
    CONTINUE  
      
    END  
      
     
    WHILE @iVal > 0  
      
    BEGIN  
       
    SET @j = 0  
       
    SET @iLog2 = @iVal / 2  --被更新字段十六進(jìn)制值除2得余數(shù)
      
       
    WHILE @iLog2 > 0  
        
    BEGIN  
         
    SET @j = @j + 1  
         
    SET @iLog2 = @iLog2 / 2  
        
    END --end @iLog2 > 0 
      
        
    -- 得到被Update 的 列ID  
        SET @iColId = 8 * @i + @j + 1  
      
        
    -- 將Update列名 賦予 @sColName  
        SELECT @sColName = S.name FROM Inserted as I,Deleted as D,Syscolumns as S WHERE I.F_id = D.F_id  
        
    AND S.id = object_id(@sTable)  
        
    AND S.colid = @iColId  
      
        
    Truncate table #Temp  
        
    --拼成功能語句
        SET @sSQL = 'INSERT INTO #Temp (f_PkVal, f_OldVal, f_NewVal) ' +  
           
    'SELECT Convert( varchar(200), I.' + @sPkName + '), ' +  
           
    'Convert( varchar(200), D.' + @sColName + '), ' +  
           
    'Convert( varchar(200), I.' + @sColName + '' +  
           
    'FROM  #Inserted as I, #Deleted as D ' +  
           
    'WHERE I.' + @sPKName + ' = D.' + @sPKName +  
           
    ' AND I.' + @sColName + ' <> D.' + @sColName  
      
        
    EXEC(@sSQL--執(zhí)行sql 
      
        
    -- 測試輸出
        Select f_pkVal,  @sColName as f_column_name, f_oldVal, f_newVal  FROM #temp  
        
    -- 實際上用將信息處理后插入消息表
        /**//*  
        ..  
         
        INSERT INTO T_Message(.)  
        SELECT 要組成的內(nèi)容
        FROM #temp  
        
    */
      
      
        
    SET @iVal = @iVal - Power(2@j)  
      
    END -- end  @iVal > 0
     SET @i = @i + 1  
       
    END -- end @i < @iSegment
     
    DROP TABLE #Inserted  
    DROP TABLE #Deleted  
    DROP TABLE #Temp  
     
    go  


    select from Syscolumns as S object_id('t_test')
    SELECT  s.name ,s.colid FROM syscolumns as s WHERE id = object_id('t_test')  and s.colid = 1

    Update T_test Set f_datetime = getdate(), f_float = 0.0123, f_int= 1  where f_id = 2


    這樣還真行,很高興又學(xué)到了一招,:)這樣很有意思,也有挑戰(zhàn)性。

    基礎(chǔ)知識:
    COLUMNS_UPDATED()是一個僅可在 Insert or Update trigger 中調(diào)用的方法.
    該方法返回 一個 varbinary 的值, 存儲了當(dāng)次Insert 或是 Update 觸發(fā)器所對應(yīng)的記錄在哪些字段上發(fā)生了Inserted or updated.在SQLSERVER 的聯(lián)機幫助[CREATE TRIGGER]和[IF UPDATE] 中 有對 COLUMNS_UPDATED () 方法的簡要描述.

    posted on 2005-09-06 09:30 Harryson 閱讀(1179) 評論(0)  編輯  收藏 所屬分類: SqlServer

    <2005年9月>
    28293031123
    45678910
    11121314151617
    18192021222324
    2526272829301
    2345678

    常用鏈接

    留言簿(10)

    隨筆分類(319)

    AJAX

    Coffee House

    CSS

    Java

    JavaScript

    Open Source

    ProjectManagement

    友情Blog

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 深夜国产福利99亚洲视频| 亚洲制服丝袜中文字幕| 国产无遮挡又黄又爽免费视频| 99精品免费视品| 亚洲大尺度无码无码专线一区| 亚洲精品国精品久久99热一| 日本免费人成黄页网观看视频| 久久久精品2019免费观看| 黄色视频在线免费观看| 亚洲爆乳无码精品AAA片蜜桃| 亚洲精品中文字幕乱码影院| 亚洲精品乱码久久久久久蜜桃不卡 | 国产亚洲精品欧洲在线观看| 亚洲免费在线视频播放| 亚洲午夜久久影院| 亚洲国产精品无码av| 亚洲一级特黄无码片| 亚洲 无码 在线 专区| 国产午夜鲁丝片AV无码免费| 日韩视频在线精品视频免费观看| 无码国产精品一区二区免费16| 国产成人免费AV在线播放| 国产在线观看无码免费视频| 一区二区三区精品高清视频免费在线播放 | 特级一级毛片免费看| 亚洲av日韩综合一区久热| 国产亚洲精品成人AA片| 亚洲一级毛片免费看| 亚洲精品国产免费| 亚洲日韩乱码中文无码蜜桃| 久久亚洲AV午夜福利精品一区| 亚洲精品无码Av人在线观看国产| 在线精品亚洲一区二区三区| 国产亚洲精品自在线观看| a级亚洲片精品久久久久久久| 国产亚洲?V无码?V男人的天堂| 中文字幕无码精品亚洲资源网| 亚洲中文字幕无码一久久区| 久久亚洲高清观看| 亚洲综合婷婷久久| 亚洲欧洲久久精品|