0

我有一个stored-procedure接受五个参数并在表上执行更新

Update Table
Set field = @Field
Where col1= @Para1 and Col2=@Para and Col3=@Para3 and col4 =@aPara4

从用户的角度来看,您可以为所有条件参数选择多个值。例如,您可以在数据库表中选择 2 个需要匹配Col1的选项(需要作为@Para1传递)

所以我将所有选定的值存储在单独的列表中。

目前我正在使用 foreach 循环进行更新

  foreach (var g in _list1)
            {
                foreach (var o in _list2)
                {
                    foreach (var l in _list3)
                    {
                        foreach (var a in _list4)
                        {
                           UpdateData(g, o, l,a);
                        }
                    }
                }
            }

我确信这不是这样做的好方法,因为这将调用数据库调用的数量。有什么方法可以忽略循环并进行最少数量的 db 调用以达到相同的结果?

更新

我正在寻找其他方法Table-Valued Parameters

4

6 回答 6

1

一种可能的方法是使用表值参数将每个条件的多个值传递给存储过程。这将减少代码中的循环,并且仍应提供您正在寻找的功能。

如果我没记错的话,它们是在 SQL Server 2008 中引入的,所以只要您不必支持 2005 或更早版本,它们应该可以使用。

于 2013-09-16T15:56:44.223 回答
1

考虑将企业库中的 MS数据访问应用程序块用于 UpdateDataSet 命令。

本质上,您将构建一个数据表,其中每一行都是一个参数集,然后针对打开的连接执行“批处理”参数集。

当然,您可以通过构建一个包含多个更新命令的字符串并针对数据库执行它来执行相同的操作。

于 2013-09-16T16:10:55.217 回答
1

由于表值参数对您来说是禁区,您可以考虑使用基于 XML 的方法:

  • 构建一个包含您想要传递的四列的 XML 文档。
  • 更改存储过程的签名以接受单个 XML 值参数,而不是四个标量参数
  • 更改存储过程的代码以根据您获得的 XML 执行更新
  • 使用您使用四个嵌套循环在内存中构造的 XML 调用您的新存储过程一次。

这应该会减少往返次数,并加快整体执行时间。这是一篇文章的链接,该文章解释了如何使用 XML 一次插入多行;您的情况有些相似,因此您应该能够使用该文章中概述的方法。

于 2013-09-16T16:19:24.017 回答
1

您可以将查询带到此表单:

Update Table Set field = @Field Where col1 IN {} and Col2 IN {} and Col3 IN {} and col4 IN {}

并以这种方式传递参数:https ://stackoverflow.com/a/337792/580053

于 2013-09-16T16:53:42.067 回答
0

只要你有更新存储过程结构的自由;我建议的方法是使用表值参数而不是多个参数。

可以在以下位置找到一个用于服务器和数据库代码的好示例:http: //www.codeproject.com/Articles/39161/C-and-Table-Value-Parameters

于 2013-09-16T15:59:39.790 回答
0

为什么要为此使用存储过程?在我看来,您不应该使用 SP 来执行简单的 CRUD 操作。存储过程的真正威力是用于繁重的计算和类似的事情。

表值参数将是我的选择,但既然您正在寻找其他方法,为什么不采用更简单的方法并在服务器端代码上动态构建批量/批量更新查询并针对数据库运行它?

于 2013-09-16T16:16:31.060 回答