在存储过程中插入或更新用户定义的表类型

时间:2014-03-28 09:15:03

标签: sql sql-server stored-procedures

我目前正在开发一个项目,我经常将大量数据插入或更新到远程数据库。数据量约为50组数据,每组数据为500-800行,这些数据进入同一个表。

目前我有一个存储过程,我调用每行插入或更新(简化以便于阅读):

ALTER PROCEDURE stat_memberstat_upsert
...
AS
BEGIN
UPDATE Memberstats ...

if(@@ROWCOUNT = 0)
BEGIN 
    INSERT INTO Memberstats ...
END
END

这样可行,但正如您所看到的那样,它会安装到对同一存储过程的大量调用中(最糟糕的情况是大约100,000次调用)。我正在研究用户定义的表类型,这听起来像一个很好的解决方案,因为它减少了对数据库服务器的调用,具有更大的类似结构。问题是,当我查看解决方案,教程和文档时,我发现没有人提到使用表类型执行插入/更新例程的方法;它是插入或更新。

使用表类型时,有没有办法进行插入/更新调用?


或者我考虑过两种解决方案:

1:使用光标

我可以使用游标迭代表类型值,并为每一行调用上面的stat_memberstat_upsert过程。这不会阻止对程序的多次调用,但由于调用是从本地存储过程完成的,因此速度可能会增加。

How to do ForEach on user defined table type in SQL Server stored procedure?(回答“为什么不使用游标???”)

2:预验证数据

第二个解决方案是检索已插入的行主键,根据传入数据验证它们并将它们分类为2个表,其中一个用于插入,另一个用于更新。然后将两个表都执行到数据库。这意味着我需要在事务中封装它,因此在验证和执行插入和更新的过程中表不会发生变化。

这些都是一个很好的解决方案吗?

1 个答案:

答案 0 :(得分:0)

解决方案可能会进一步放缓。 您只需将insert语句放入表

即可
ALTER PROCEDURE stat_memberstat_upsert
...
AS
INSERT INTO Memberstats_temp ...
END

并且有一个批处理进程,该进程将在低流量时运行,以便在截断此临时表后更新/插入Memberstats_temp表中的Memberstats表。如果您需要对表格进行实时更新,这将不是一个解决方案。