哪个更快?插入或直接存储过程后触发

时间:2012-03-01 02:25:01

标签: sql sql-server sql-server-2000

我正在临时表中上传大量Excel记录。然后我需要对这些行求和,然后用PK总结到主表。

我在Insert之后创建了一个触发器,它检查插入是否已存在于主表中(Not existing将插入,现有将更新该行中的所有列)。

所以为了触发这个TRIGGER,我需要插入另一个临时表

INSERT INTO TEMPTBL (select SUM(...)...* from temptable)

然后触发器将插入/更新到主表。

我想知道这是正确的方法还是仅使用单个TEMP表然后使用SP来使用1 CURSOR FETCH(用于更新现有行)进行检查,然后使用Insert进行检查。

提前感谢您的阅读。只需知道哪些是理想/更快,因为这些将处理多用户(请不要介意死锁:D)

1 个答案:

答案 0 :(得分:3)

你建议的两种方法都是程序性的(逐行),但我认为应该有一套基于集合的解决方案(所有记录一次)用于你正在做的事情。

而不是触发器或游标,一次插入所有记录,并在insert语句中包括一个检查以排除表中已存在的任何记录。类似的东西:

INSERT INTO YourTable (Column1, Column2...)
SELECT Column1, Column2...
FROM TempTable tt
WHERE NOT EXISTS (
    SELECT 1
    FROM YourTable yt
    WHERE tt.ID = yt.ID
)

编辑:

对于您的更新,您可以执行类似的操作。在插入之前,将临时表连接到现有表,并更新匹配的记录:

UPDATE yt
SET Column1 = tt.Column1, Column2 = tt.Column2
FROM
    YourTable yt JOIN
    TempTable tt ON tt.ID = yt.ID