1个存储过程具有灵活的参数,还是许多存储过程?

时间:2010-06-23 07:37:21

标签: sql-server stored-procedures

我想对实现相同存储过程的两种方法有所了解。任何建议将不胜感激。

实施1

CREATE PROC GetFileSize(@Path varchar(500) = NULL, @FileID int = NULL)
AS 
     IF @Path IS NULL 
         ' Find the file by @FileID and return its size
     ELSE
         ' Find the file by @Path and return its size

实施2

CREATE PROC GetFileSizeByPath(@Path varchar(500))
AS

CREATE PROC GetFileSizeByFileID(@FileID int)
AS

您更喜欢哪种实施方式?为什么?

干杯, MOSH

3 个答案:

答案 0 :(得分:2)

第二个更优雅,更干净。

执行第一个方法的唯一原因是两个方法的代码几乎相同。那么防止代码重复是合理的。在所有其他场景中,我不明白为什么要混合使用这种方法,因为将这种方法推向极端将是一个巨大的存储过程,它有一个大的if语句来决定在给定某些特定参数的情况下执行哪些代码,这完全违背了模块化设计的目的

答案 1 :(得分:1)

如果只有两个变体(如您的示例中所示),并且它们从不重叠,则可以更容易地找到单独的过程(并且名称更具描述性)。

如果是广义搜索,例如人们可能有10个不同的参数,其中一些或全部可能以不同的组合提供,那么创建一个处理这些变化的程序会更有意义。

对于SQL中的通用搜索,我总是推荐Erland Sommarskog的articles

答案 2 :(得分:0)

我更喜欢带有可选参数的单个存储过程,因为这通常意味着代码不必在多个过程中重复。使用默认值NULL是一个非常强大的工具。我经常使用类似的东西:

SELECT * FROM Table WHERE ISNULL(@Parameter, Value) = Value

如果参数为NULL,它将匹配所有记录,否则只匹配请求。