我想将一个表中的数据导出到一个带夜间作业的新表中。
为防止生成dublicates,我在源表中实现了一个名为“ExportState”的列,其中0表示未导出,1表示导出。
我的问题是,我想导出数据,然后将State设置为1.但是我无法生成INSERT INTO ... SELECT
然后更新语句,因为可能会将其他数据插入到源表中导出例程运行时。所以我最后会将我从未插入到目标表的记录中的ExportState更新为1。
您对以下解决方案有什么建议吗?
一个。逐行INSERT INTO ... SELECT
和UPDATE
ExportState
B.获取快照数据的Snaphot INSERT
和UPDATE
ExportState
哪个更有意义?
第二个问题:源表和目标表位于不同的SQL Server和数据库实例上。想法?
答案 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