Stored-Procedures
遵守 DRY 原則是否證明了動態 SQL 的合理性?
假設我有兩個經常針對我的數據庫執行的查詢:
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(權限升級)或對基表的權限。使用普通儲存過程不需要此類權限。
您可能還擁有不同的客戶端程式碼:我們為每個客戶端設置了儲存過程(模式控制權限)。您想將所有表的選擇權限授予所有客戶端嗎?