Stored-Procedures

遵守 DRY 原則是否證明了動態 SQL 的合理性?

  • July 21, 2011

假設我有兩個經常針對我的數據庫執行的查詢:

SELECT 
 UserID,
 UserName,
 UserGender
FROM Users
WHERE UserID = @User

SELECT 
 UserID,
 UserName,
 UserGender
FROM Users
WHERE UserName LIKE @Name + '%

它們應該在兩個單獨的儲存過程中,還是只是一個使用 sp_executesql 動態創建語句的單個儲存過程?

如果它們在兩個儲存過程中,那麼如果我想在 SELECT 語句中添加或刪除列,我將需要修改這兩個過程。如果我使用動態 SQL,那麼我大概會犧牲少量的性能。

在這種情況下,使用動態 SQL 的可維護性和遵守 DRY 原則(不要重複自己)會優先於儲存過程的性能增益嗎?

Strict DRY 並不真正適用於數據庫

我已經看到 DRY 被用作創建“重用”視圖的理由。然後我們有視圖加入視圖等,並且表現不佳。

通常,類似的查詢將以不同的方式使用。一個可能有聚合,一個可能沒有,過濾器會有所不同(如上所述)。相似性不能證明動態 SQL 的合理性,也不能證明視圖的合理性。

在您上面的特定情況下,我會考慮使用 IF 語句來擷取差異,特別是如果程式碼是由相同的搜尋頁面或表單發布的:您具有基於使用的相似性,而不僅僅是使用的相同列和表。

此外,您還需要考慮安全性。

動態 SQL 需要 EXECUTE AS(權限升級)或對基表的權限。使用普通儲存過程不需要此類權限。

您可能還擁有不同的客戶端程式碼:我們為每個客戶端設置了儲存過程(模式控制權限)。您想將所有表的選擇權限授予所有客戶端嗎?

引用自:https://dba.stackexchange.com/questions/3999