Sql server 使用一个单一的存储过程来接受数量可变的参数是否是一种良好的做法
我正在从事一个网络项目,在那里我必须检索(比方说)员工记录。在某些情况下,我必须通过提供EmployeeID来检索单个记录。在其他情况下,我必须通过提供SectorID来检索多个员工记录。此逻辑可以扩展到其他场景:获取所有员工记录、通过资格获取员工记录等 使用一个接受可变数量参数的存储过程来处理不同的场景(未提供参数时使用默认值)是否是一种好的做法。例:Sql server 使用一个单一的存储过程来接受数量可变的参数是否是一种良好的做法,sql-server,database,stored-procedures,Sql Server,Database,Stored Procedures,我正在从事一个网络项目,在那里我必须检索(比方说)员工记录。在某些情况下,我必须通过提供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