SQL:将数据导出到新表并同时更新旧数据

时间:2011-11-30 13:59:42

标签: sql-server tsql insert export

我想将一个表中的数据导出到一个带夜间作业的新表中。

为防止生成dublicates,我在源表中实现了一个名为“ExportState”的列,其中0表示未导出,1表示导出。

我的问题是,我想导出数据,然后将State设置为1.但是我无法生成INSERT INTO ... SELECT然后更新语句,因为可能会将其他数据插入到源表中导出例程运行时。所以我最后会将我从未插入到目标表的记录中的ExportState更新为1。

您对以下解决方案有什么建议吗?

一个。逐行INSERT INTO ... SELECTUPDATE ExportState B.获取快照数据的Snaphot INSERTUPDATE ExportState

哪个更有意义?

第二个问题:源表和目标表位于不同的SQL Server和数据库实例上。想法?

2 个答案:

答案 0 :(得分:0)

我会创建一个存储过程来执行任务。

在存储过程中创建表变量或临时表。将ExportState = 0的源表中的数据插入临时表。 (如果此表上有主键,则只将主键存储在临时表中。)

从源表到目标表执行insert语句。

使用临时表,执行update语句,为临时表中的每条记录设置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

从夜间工作中调用存储过程。

答案 1 :(得分:0)

要连接到其他SQL Server上的数据库,请查看使用链接服务器。您应该能够在SSMS 2008中的“服务器对象”文件夹下配置一个。如果您感兴趣,可以在此处链接到更多信息... http://msdn.microsoft.com/en-us/library/ff772782.aspx