如何将存储过程中的大量参数从代码传递到SQL Server

如何从代码中将大量参数(比如说20+)传递给存储过程?

就像我们可以将一个类对象中的所有参数分组然后将其传递一样,但是如何在存储过程的情况下实现这一点。

目前我必须创建20多个变量来传递参数。

谢谢Ashwani

如果您使用的是SQL Server 2008,请使用表值参数 。 如果您不熟悉,它基本上允许您将表作为参数传递给存储过程。 好处是您可以构建您传入的DataTable以查找您想要的内容。

我做了类似的事情而不是通过几十个参数,我通过一个TVP,有两列[KEY]和[VALUE]。 这样,当您的参数在将来发生变化时,存在一个抽象层来隔离迁移。 当然,您如何选择实施它取决于具体情况。

首先,看看需要这么多参数的设计 – 有没有办法可以减少向服务器发送这么多信息的需要?

其次,再次回到第一点,因为它仍然“闻到”错误:-)

然后你可以做以下事情:

  • 拆分存储过程。 如果您不必将所有数据作为单个相关的块传递,那么您可以将一个SP拆分为多个执行整个操作的不同部分的SP(例如,将用户名和地址详细信息与添加其最新购买分开更新,管他呢)

  • 结合参数。 如果您有五个指示各种选项的布尔值,那么您可以将它们组合成一个带有按位运算的“flags”字节。 或者,如果您有两个32位整数只能保持0..5,000之间的值,那么它们可以合并为一个32位整数。 等等

  • 将所有参数序列化为“文件格式”,并将数据作为单个二进制或文本参数发送,您可以在存储过程中对其进行反序列化。

当然,这些方法意味着每次编码和解码许多参数,这可能比分别传递它们更糟糕。 实际上,人们可能会争辩说SQL调用机制已经在为您做上述事情。

通常不需要很多变量来存储参数; 你需要为每个arg添加SqlParameter (etc),但是你可以在循环中设置它们(/ etc)。

在2.0中执行此操作的最佳方法是将包含所有参数的XML传递给存储过程,然后使用OPENXML获取每个参数。 然后在SP中使用它。

请参阅这些链接

将参数作为Xml传递给存储过程和http://www.eggheadcafe.com/articles/20030627c.asp