2010-06-23 99 views
2

我想獲得您對兩種實現相同存儲過程的方式的看法。任何建議將不勝感激。具有靈活參數或許多存儲過程的1個存儲過程?

實現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

回答

2

第二個是更優雅和清潔。

執行第一個操作的唯一原因是兩個方法的代碼幾乎完全相同。那麼防止代碼重複是合理的。在所有其他情況下,我不明白爲什麼要混合這些方法,因爲將這種方法應用到極端情況將會是一個巨大的存儲過程,它有一個大的if語句來決定執行哪個代碼,給出一些特定參數,這完全違背了模塊化設計的目的。

0

我更喜歡帶有可選參數的單個存儲過程,因爲這通常意味着代碼不必通過多個過程來複制。使用默認值NULL是一個非常強大的工具。我經常使用類似:

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

如果該參數爲NULL,它將匹配所有記錄,否則只有那些要求。

+0

我認爲應該是'WHERE ISNULL(@Parameter,值)= Value'。 – 2010-06-23 07:53:19

+0

這種方法意味着索引查找永遠不會被使用,並且您將以完整的掃描結束。 – 2010-06-23 07:57:44

1

如果只有兩種變體(如你的例子),並且它們從不重疊,那麼單獨的procs可以更容易找到(並且名稱更具描述性)。

如果這是一個廣義的搜索例如人們可能有10個不同的參數,其中一些或全部可以以不同的組合提供,那麼創建處理這些變化的單個程序將更有意義。

對於SQL通用搜索,我總是建議厄蘭Sommarskog的articles