2011-11-30 57 views
0

我想從一張表中將數據導出到新的夜間作業中。SQL:將數據導出到新表中並同時更新舊數據

爲了防止生成dublicates,我在源表中實現了一個名爲「ExportState」的列,其中0表示未導出,1表示導出。

我的問題是,我想導出數據,然後將狀態設置爲1.但是我不能創建INSERT INTO ... SELECT,然後更新語句,因爲可能會在導出時將其他數據插入到源表中例行運行。所以我會在最後將ExportState更新爲1,我從未插入目標表的記錄。

您對以下解決方案有何建議?

A. INSERT INTO ... SELECT和排
B. UPDATE ExportState一行乘坐Snaphot INSERT和的snapshoted數據

哪個更有意義UPDATE ExportState?

第二個問題:源表和目標表位於不同的SQL Server和數據庫實例上。想法?

回答

0

我會創建一個存儲過程來執行任務。

在存儲過程中創建表變量或臨時表。將ExportState = 0的源表中的數據插入到臨時表中。 (如果此表上的主鍵只是將主鍵存儲在臨時表中)。

執行從源表到目標表的插入語句。

使用您的臨時表,執行您的更新語句,爲您的臨時表中的每個記錄設置ExportState = 1。

將所有這些都包含在一個事務中。

示例代碼:

BEGIN TRAN 

DECLARE @Exported TABLE (PK INTEGER NOT NULL); 
INSERT INTO @Exported (PK) SELECT PK FROM SourceTable WHERE ExportState = 0; 

INSERT INTO @DestinationTable (Field Names) 
SELECT FieldNames 
FROM SourceTable s 
INNER JOIN @Exported e 
ON s.PK = e.PK 
WHERE s.ExportStatus = 0; 

UPDATE s SET ExportStatus=1 
FROM SourceTable s 
INNER JOIN @Exported e 
on s.PK =e.PK; 

COMMIT TRAN 

從你每晚的作業調用存儲過程。

+0

好的,謝謝 這似乎是一個愚蠢的想法。 第二個問題:源表和目標表位於不同的SQL Server和數據庫實例上。 想法? – user1073472

相關問題