Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 哪个更快?插入或直接存储过程后的触发器_Sql_Sql Server_Sql Server 2000 - Fatal编程技术网

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

Sql 哪个更快?插入或直接存储过程后的触发器,sql,sql-server,sql-server-2000,Sql,Sql Server,Sql Server 2000,我正在临时表中上传大量Excel记录。然后我需要对这些行进行求和,并将求和后的行与PK一起放入主表 我在Insert之后做了一个触发器,检查插入的内容是否已经存在于主表中。Not existing will Insert,existing将更新该行中的所有列 所以要触发这个触发器,我需要插入另一个临时表 插入到TENTBL中,从TENTABLE中选择SUM……* 然后触发器将插入/更新主表 我想知道这是否是正确的方法,或者只是使用一个临时表,然后使用SP进行检查,使用1个游标获取现有行的更新,然

我正在临时表中上传大量Excel记录。然后我需要对这些行进行求和,并将求和后的行与PK一起放入主表

我在Insert之后做了一个触发器,检查插入的内容是否已经存在于主表中。Not existing will Insert,existing将更新该行中的所有列

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

插入到TENTBL中,从TENTABLE中选择SUM……*

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

我想知道这是否是正确的方法,或者只是使用一个临时表,然后使用SP进行检查,使用1个游标获取现有行的更新,然后插入其余行


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

您建议的两种方法都是合理的程序性逐行执行,但我认为应该有一种基于集合的解决方案,可以一次完成所有记录

不要使用触发器或游标,而是一次插入所有记录,并在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

这就是我在SP中为插入部分所做的。问题在于更新。我需要更新现有行中的一些列。我想我应该在存在行的地方使用DELETE*。然后插入其余部分。可以吗?此外,我如何最小化这些日志,因为用户可以上传数千行。我将使用TRUNCATE TABLE,但我担心它会立即截断其他用户最近上传的数据:D@sid开始时,数千行似乎很多,但SQL Server是为处理数百万行而构建的。我认为,只要采用干净、基于集合的方法,就不必太担心性能。考虑到这一点,update语句生成的日志条目将少于delete/insert语句。我不认为你需要删去所有的内容。。。你的临时表应该是每个连接,当你完成后,它会自动清理。我明白了。知道了!谢谢你的更新。。我刚才说的临时表并不是一个很吸引人的表,而是一个没有PKs的真正的表,因为我对Excel上传的行使用了批量插入