2

我有来自 datastage 的数据,这些数据被放入我们的 SQL Server 2008 数据库中的表中:stg_table_outside_data. 我们的来源每天早上都将数据放入该表中。我想将数据从我保留多天数据 stg_table_outside_data的地方移动。table_outside_data

我创建了一个存储过程,将数据从中stg_table_outside_Data插入table_outside_data然后截断stg_table_outside_Data。外部的 datastage 进程不在我的控制范围内,所以我必须在 SQL Server 2008 中完成这一切。我原本计划使用一个简单的 after insert 语句,但 datastage 在每 100,000 行之后执行一次提交。触发器将在第一次提交后运行,并导致数据阶段进程出现死锁错误。

有没有办法设置插入后等待 30 分钟,然后确保在该时间范围内没有新的提交?我的问题有更好的解决方案吗?目标是将数据从临时表中取出并进入工作表而不重复,然后截断临时表以供第二天早上的负载使用。

感谢您的时间和帮助。

4

4 回答 4

2

您可以做到这一点的一种方法是利用MERGESQL Server 2008 中的新语句(请参阅MSDN 文档此博客文章),并将其安排为每 30 分钟左右的 SQL 作业。

MERGE 语句允许您轻松定义操作(INSERT、UPDATE、DELETE 或根本不执行任何操作),具体取决于源数据(您的临时表)和目标数据(您的“真实”表)是否符合某些条件,或者不是。

所以在你的情况下,它会是这样的:

MERGE table_outside_data AS target
USING stg_table_outside_data AS source 
ON (target.ProductID = source.ProductID)   -- whatever join makes sense for you

WHEN NOT MATCHED THEN
    INSERT VALUES(.......)

WHEN MATCHED THEN 
    -- do nothing
于 2010-01-12T17:12:39.447 回答
1

您不应该使用触发器来执行此操作,而应该使用计划的作业。

于 2010-01-12T17:12:17.580 回答
0

对触发器进行行计数,如果计数小于 100,000,则不执行任何操作。否则,运行您的进程。

于 2011-09-26T15:10:18.950 回答
0

可能构建一个程序,每天一次将所有数据从 stg_table_outside_Data 移动到 table_outside_data,或者使用作业调度程序。

于 2010-01-12T17:13:46.557 回答