我想对实现相同存储过程的两种方法有所了解。任何建议将不胜感激。
实施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
答案 0 :(得分:2)
第二个更优雅,更干净。
执行第一个方法的唯一原因是两个方法的代码几乎相同。那么防止代码重复是合理的。在所有其他场景中,我不明白为什么要混合使用这种方法,因为将这种方法推向极端将是一个巨大的存储过程,它有一个大的if语句来决定在给定某些特定参数的情况下执行哪些代码,这完全违背了模块化设计的目的
答案 1 :(得分:1)
如果只有两个变体(如您的示例中所示),并且它们从不重叠,则可以更容易地找到单独的过程(并且名称更具描述性)。
如果是广义搜索,例如人们可能有10个不同的参数,其中一些或全部可能以不同的组合提供,那么创建一个处理这些变化的程序会更有意义。
对于SQL中的通用搜索,我总是推荐Erland Sommarskog的articles
答案 2 :(得分:0)
我更喜欢带有可选参数的单个存储过程,因为这通常意味着代码不必在多个过程中重复。使用默认值NULL是一个非常强大的工具。我经常使用类似的东西:
SELECT * FROM Table WHERE ISNULL(@Parameter, Value) = Value
如果参数为NULL,它将匹配所有记录,否则只匹配请求。