在决定将逗号分隔的字符串传递给存储过程而不是按记录单独调用它时,我应该考虑什么?

Rac*_*hel 4 performance sql-server-2005 stored-procedures entity-framework

我必须为大量记录(数百或数千,取决于用户选择)运行相同的存储过程。该过程相当基本:在两个单独的表中插入一条记录,其中包含一些计算值,并可选择更新第三个表上的两列。

我的应用程序有一个List<T>记录,我正在尝试决定是否应该遍历列表并在每条记录上运行该过程,或者将 id 值组合成单个字符串并进行单个数据库调用。如果我进行单个数据库调用,那么 SQL 将负责将逗号分隔的字符串转换为临时表并同时在所有记录上运行脚本。

我倾向于将逗号分隔的 Id 字符串传递给程序,但我不确定这是否是进行这种大规模更新的理想方式,或者我是否遗漏了一些会影响此决定的关键因素.

在决定是否应该将逗号分隔的 id 字符串传递给存储过程而不是按记录单独调用它时,我应该考虑什么?或者有没有更有效的方法来从应用程序进行这种更新?

我正在使用 SQL Server 2005 和实体框架

Wor*_*DBA 5

就我个人而言,我会选择将 id 列表作为表参数传递给存储过程,这将允许您执行基于集合的更新,而不是效率较低的逐行更新。

我从来没有亲自使用过 EF,但是下面有一篇关于使用 ADO 执行上述操作的好文章(忽略它说它适用于 SQL 2008 的事实,因为它也适用于 2005)。在这种情况下,相同的策略更适合您,但您可能需要根据您使用实体框架的事实调整实现。

http://www.mssqltips.com/sqlservertip/2112/table-value-parameters-in-sql-server-2008-and-net-c/

编辑

正如您正确指出的那样,我对这在 2005 年有效的事实是错误的 - 对此感到抱歉!

但是,我有一些替代建议。

由于 SQL Server 2005 确实支持表变量(只是不像您指出的那样作为存储过程的参数),您可以解析分隔的字符串并将 id 插入到表变量中。然后,您可以使用表变量来执行基于集合的更新。

或者,下面的链接通过首先将值持久化到表中,从而避免对 id 值进行序列化和反序列化,从而对同一问题提供了不同的看法:

http://weblogs.sqlteam.com/jeffs/archive/2007/06/26/passing-an-array-or-table-parameter-to-a-stored-procedure.aspx

我希望这可以帮助你。