2011-11-30 32 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

相关问题