<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

    最新隨筆

    最新評論

    閱讀排行榜

    評論排行榜

    主站蜘蛛池模板: 亚洲综合成人网在线观看| 亚洲日韩精品无码一区二区三区| 456亚洲人成在线播放网站| 18未年禁止免费观看| 亚洲欧洲精品国产区| 国产一卡2卡3卡4卡无卡免费视频| 亚洲成a人片在线网站| 在线美女免费观看网站h| 亚洲日本在线播放| 综合在线免费视频| 亚洲av无码专区亚洲av不卡| 免费久久精品国产片香蕉| 国产A∨免费精品视频| 亚洲国产精品SSS在线观看AV| 免费无码又爽又刺激高潮视频| 91亚洲精品自在在线观看| 91视频国产免费| 国产成人亚洲综合a∨| 不卡精品国产_亚洲人成在线| 久9这里精品免费视频| 国产精品亚洲精品青青青| 免费观看国产精品| 色www永久免费| 亚洲乱码一二三四区乱码| 免费a级毛片无码av| 男的把j放进女人下面视频免费| 亚洲乱码卡三乱码新区| 国产99视频免费精品是看6| 丁香花在线观看免费观看图片 | 好男人视频在线观看免费看片| 污污视频网站免费观看| 亚洲综合激情九月婷婷| 免费少妇a级毛片人成网| 日韩免费电影网站| 亚洲国产精品99久久久久久| 亚洲男同帅GAY片在线观看| 18勿入网站免费永久| 国产精品玖玖美女张开腿让男人桶爽免费看 | 日韩人妻无码免费视频一区二区三区 | 91免费国产自产地址入| 亚洲AV日韩AV无码污污网站 |