Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.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 server 使用一个单一的存储过程来接受数量可变的参数是否是一种良好的做法_Sql Server_Database_Stored Procedures - Fatal编程技术网

Sql server 使用一个单一的存储过程来接受数量可变的参数是否是一种良好的做法

Sql server 使用一个单一的存储过程来接受数量可变的参数是否是一种良好的做法,sql-server,database,stored-procedures,Sql Server,Database,Stored Procedures,我正在从事一个网络项目,在那里我必须检索(比方说)员工记录。在某些情况下,我必须通过提供EmployeeID来检索单个记录。在其他情况下,我必须通过提供SectorID来检索多个员工记录。此逻辑可以扩展到其他场景:获取所有员工记录、通过资格获取员工记录等 使用一个接受可变数量参数的存储过程来处理不同的场景(未提供参数时使用默认值)是否是一种好的做法。例: 我认为更容易维护和测试的是,对于每个场景,您都有一个具有固定接口的存储过程 据我所知,不建议这样做。因为每次添加新标准时,您都必须更改您的过程

我正在从事一个网络项目,在那里我必须检索(比方说)员工记录。在某些情况下,我必须通过提供EmployeeID来检索单个记录。在其他情况下,我必须通过提供SectorID来检索多个员工记录。此逻辑可以扩展到其他场景:获取所有员工记录、通过资格获取员工记录等

使用一个接受可变数量参数的存储过程来处理不同的场景(未提供参数时使用默认值)是否是一种好的做法。例:


我认为更容易维护和测试的是,对于每个场景,您都有一个具有固定接口的存储过程

据我所知,不建议这样做。因为每次添加新标准时,您都必须更改您的过程,最终您将得到一个难以维护和调试的庞大标准

如果SP被拆分为多个,那么系统中的其他模块将更容易访问其特定需求(就像其他一些模块希望仅通过扇区id获取emp,那么为什么它们需要传递所有可选参数)


每次相同的SP更改时,每个使用此SP的SP都必须更改其DAC。

您的过程具有ORs,这会阻止它使用索引,从而导致性能降低。您可以动态构建SQL(sp_executesql),但每次执行查询时都需要重新编译查询。您失去了存储过程的一些优势(不需要每次使用查询时都重新编译查询)。如果您决定这样做,请阅读“使用重新编译”选项。

这是一篇关于此主题的非常全面的文章:

它涵盖了尝试使用多个可选搜索条件编写查询的所有问题和方法

目录如下:

   Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History

我担心的是,如果您创建10个不同的存储过程来处理每个可能的场景,那么维护它们可能是一场噩梦。如果一个sp的逻辑发生了变化,您也必须在所有其他sp中进行。如果您使用的是SQL Server 2005或更高版本,则可以使用IFs在同一过程中进行多个查询,并且每个查询都将为其保存一个查询计划(相当于在旧版本中的每个查询都有一个过程),请参阅我的答案中的文章或链接至适当部分:KM,您也可以在早期版本的SQL Server中执行此操作。KM,我浏览了那篇[很棒]的文章,但没有看到任何内容支持您的陈述,“您可以使用IFs在同一过程中进行多个查询,每个查询都将为其保存一个查询计划”。你有这方面的参考资料吗?我很好奇也很有希望。这篇文章太棒了!万分感谢!如果你读了这篇文章,你会发现没有简单和/或正确的答案。你如何处理这一切取决于眼前的情况和你愿意做出的权衡。
   Introduction
      The Case Study: Searching Orders
      The Northgale Database
   Dynamic SQL
      Introduction
      Using sp_executesql
      Using the CLR
      Using EXEC()
      When Caching Is Not Really What You Want
   Static SQL
      Introduction
      x = @x OR @x IS NULL
      Using IF statements
      Umachandar's Bag of Tricks
      Using Temp Tables
      x = @x AND @x IS NOT NULL
      Handling Complex Conditions
   Hybrid Solutions – Using both Static and Dynamic SQL
      Using Views
      Using Inline Table Functions
   Conclusion
   Feedback and Acknowledgements
   Revision History