自訂的Table快取機制與KeyValue應用

出自 ProgWiki
前往: 導覽搜尋

用途

  • 在近端的DB建立Table作為遠端DB在近端的資料快取。
使用比對資料異動時間的方式,來判斷是否重建近端DB的Table。

程式碼

  • 遠端DB的Select預先用View進行封裝(例如 View_Stock_LastDate 與 View_Stock)
  • 以下包進自訂的SQL預存程序裡
DECLARE @KeyName nvarchar(50);
    DECLARE @KeyValue nvarchar(50);
    DECLARE @strUpdateDate AS NVARCHAR(50);
    DECLARE @UpdateDate AS datetime;                    --上次抓的資料的最後異動日期
    DECLARE @UpdateDate_Remote AS datetime;        --遠端DB上的資料的最後異動日期
 
    DECLARE @IsUpdateDate int;
    set @IsUpdateDate = 0;
 
 
--更新自訂快取的庫存紀錄
begin transaction
    set @KeyName = 'StockUpdateDate';   --自訂的快取機制用的變數名
    select @strUpdateDate= [dbo].[getKeyValue](@KeyName);
    if (@UpdateDate = '')
        set @UpdateDate = null;
    else
        set @UpdateDate = convert(datetime, @strUpdateDate);
    select @UpdateDate_Remote = [LastDate] from View_Stock_LastDate;
 
    --如果資料異動
    if ((@UpdateDate is null) or (@UpdateDate_Remote > @UpdateDate))
        begin
            select @IsUpdateDate = @IsUpdateDate + 1;
 
--刪除近端暫存用的實體Table, 並自View中從新抓資料產生新的Table
            IF EXISTS (SELECT * FROM sys.objects WHERE object_id = OBJECT_ID(N'[dbo].[Table_Stock]') AND type in (N'U'))
                drop table Table_Stock;
            select * into Table_Stock from View_Stock;
 
--記錄近端資料的最後更新時間
            set @KeyValue = convert(nvarchar(50),@UpdateDate_Remote );
            EXECUTE @RC = [dbo].[setKeyValue] @KeyName,@KeyValue;
        end
--如果都成功, 就繼續,反之就回退
if (@@Error = 0)
    commit transaction
else
    rollback transaction

相關