出自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
相關