[英]Is it a bad practice to put Insert/Update/Delete/Select into a single stored procedure?
因此,我們被告知存儲過程已優化,我們絕不應該將sql語句放入代碼中。
但是我不想為我需要的每種查詢或數據庫操作類型制作10,000個存儲過程。
因此,我已經開始執行以下操作(將所有功能放入一個sproc中):
CREATE PROCEDURE [dbo].[spTABLENAME]
@Function nvarchar = null,
@ID int = null,
@MoreVariables int = null
AS
BEGIN
SET NOCOUNT ON;
IF @Function = 'UPDATE'
BEGIN
UPDATE UPDATESTUFF WHERE ID = @ID;
END
ELSE IF @Function = 'INSERT'
BEGIN
INSERT INTO TABLENAME (STUFF)
END
ELSE IF @Function = 'SELECT'
BEGIN
SELECT * FROM TABLENAME WHERE ID= @ID
END
ELSE IF @Function = 'DELETE'
BEGIN
DELETE * FROM TABLENAME WHERE ID = @ID
END
結束
有人可以告訴我這種做法是否有誤?
使用單個“ UPSERT”過程是相當普遍的,但是也有可能返回數據的過程對我來說並不適合。
要記住的另一件事是,如果您使用單個存儲的proc,則可以從緩存計划中獲得一些額外的好處,而使用多合一例程可能無法從中受益。
這種破壞了使用存儲過程的目的和目的。
擁有一個存儲的proc並沒有錯,可以確定是否要INSERT
或UPDATE
用戶,具體取決於是否存在用戶。 但是擁有一個“通用”存儲過程來做所有事情並不是很有幫助。
如果我是一名開發人員來處理您的項目,並且想編寫一個數據訪問類來操縱您的用戶,那么我寧願遇到這些sp_AddUser
, sp_DeleteUser
, sp_UpdateUserAddress
等,而不僅僅是:
sp_doStuffToUsers
在我看來,這本身就是一個足夠充分的理由!
我不完全不編寫SQL是不正確的。 只要SQL小,我們就可以在代碼中包含SQL。 對於復雜的聯接,我們可以創建視圖,然后在代碼中使用它們。
如果查詢很大,或者您試圖通過進行多個查詢來獲取或構建某些數據,則可以選擇存儲過程。
就是說,您不需要將SELECT / UPDATE / INSERT捆綁到存儲過程中,因為它會影響可讀性並增加存儲過程的復雜性,從而導致維護問題。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.