2010-01-15 79 views
1

我想在我的表数据更改时进行一些计算。但是,我正在手动更新我的表格,并一次复制粘贴大约3000行。这使我的触发器工作了3000次,但我希望它只触发一次。SQL Server触发器工作 - 只触发一次

有没有办法做到这一点?

谢谢。

回答

1

如果通过“手动”,你的意思是你复制并粘贴到某个用户界面工具(如Access dataGrid)或类似的东西,那么该工具可能会在每行发出一个插入语句,在这种情况下,运气不好的话,数据库触发器将在每个插入语句中执行一次。正如其他答案所提到的那样,如果您可以使用单个插入语句将行直接插入数据库中,那么触发器将只触发一次。

+0

是的我正在使用访问 – stckvrflw 2010-01-15 15:06:41

+0

是的,正如我想的那样......恐怕只要你坚持这样做手动,通过访问tableview(或任何被称为) - 你卡住了。 – 2010-01-15 16:31:12

5

你的声明是什么?

如果您有多个插入那么它会触发您正在运行的每个插入。如果你想让它多刀片只执行一次,你必须:

  1. 编写插入一个单独的语句,如insert into foo select * from bar
  2. ,您的触发不能为每一行

其他的可能性是:

  1. 禁用触发
  2. 执行的插入
  3. 将触发代码在存储过程中
  4. 运行存储过程,如果你是在一个单独的语句修改3000行
0

,您的触发不会闪光3000次。你的触发器会触发一次,虚拟“删除”表中将有3000行。

+0

我认为通过'手动'的OP可能意味着他正在复制和粘贴到一些像访问网格之类的UI工具或类似的东西,在这种情况下,该工具可能会发出每行一个插入语句...... – 2010-01-15 14:56:29

1

该问题是由于您手动粘贴3000行而引起的。你真的有2个解决方案。你可以这样做关闭触发:

ALTER TABLE tablename DISABLE TRIGGER ALL 
-- do work here 
ALTER TABLE tablename ENABLE TRIGGER ALL 

,然后在运行触发的内容然后结束或者你可以把你的3000列到一个临时表,然后一次插入它们。这只会设置1个触发器。如果这还不够,请给我们更多关于你想要做什么的信息。

+0

那么我没有明确的解决你的第一种解决方法。你说“在这里工作”,但我正在手动做这项工作?你是什​​么意思,我想我错了。顺便说一句我正在使用访问时复制粘贴。 – stckvrflw 2010-01-15 15:08:29

+0

我的意思是运行ALTER TABLE tablename DISABLE TRIGGER ALL,然后粘贴你的行,然后运行ALTER TABLE tablename ENABLE TRIGGER ALL。一旦完成,您需要运行触发器中的脚本,以便更新所有这些行。 – 2010-01-15 16:49:07

0

如果您限制如何将数据导入到每行插入一次的系统中,我建议您将数据导入到中间表中,然后从中间表中插入到最终表中。