2010-01-12 102 views
2

我有数据从正在把我们的SQL Server 2008数据库中的表的DataStage进来:stg_table_outside_data。我们的来源是每天早上将数据放入表格中。我想将数据从stg_table_outside_data移到table_outside_data,我在那里保存了多天的数据。INSERT触发器后 - SQL Server 2008中

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

有没有一种方法来设置插入后要等待30分钟,然后确保有没有规定时间内一个新的承诺?有没有更好的解决方案来解决我的问题?我们的目标是将数据从临时表中移出并进入工作表,不会出现重复,然后截断第二天早上装载的临时表。

我感谢您的时间和帮助。

回答

2

你可以这样做的一种方法是利用SQL Server 2008中新的MERGE语句(请参阅MSDN docsthis blog post),并将其作为SQL作业每隔30分钟左右进行一次调度。

根据源数据(您的登台表)和目标数据(您的“真实”表)是否匹配,MERGE语句允许您轻松定义操作(INSERT,UPDATE,DELETE或完全没有)一些标准,或不。所以你的情况

,这将是这样的:

​​
1

你不应该使用触发器来做到这一点,你应该使用计划的工作。

+0

我希望我能。我们公司不会让我们设定预定的工作。我们必须让DBA参与进来,项目计划让我们走出了3个月。我有我们在等待名单上,但我希望找到一个临时解决方案。 – Azzna 2010-01-12 17:36:53

+1

需要3个月的时间才能获得dba安排工作?五分钟或更少的任务?真?但他们让你陷入触发器?多么奇怪。 – HLGEM 2010-01-12 18:29:03

+0

我们不允许安排工作,因为他们无法阻止我们安排工作从公司内的其他数据库获取数据。但是,我们可以设置触发器,因为它是构建的并包含在我们自己的数据库中。 – Azzna 2010-01-12 19:48:42

0

可能建立从stg_table_outside_Data将所有数据的一天,或者使用作业调度程序来table_outside_data一次的过程。

0

对触发器进行一次计数,如果计数小于100,000则什么都不做。否则,运行你的过程。