![](/img/trans.png)
[英]Benefits of using a Case statement over an If statement in a stored procedure?
[英]Using CASE Statement in Stored Procedure
我有一個存儲過程,它根據指定的輸入參數調用其他存儲過程。
它是這樣的:
CREATE PROCEDURE dbo.usp_SPCaller
@Input_Param1 NVARCHAR(100) = NULL,
@Input_Param2 NVARCHAR(100) = NULL
AS
BEGIN
SET NOCOUNT ON
IF ((@Input_Param1 IS NOT NULL) AND (@Input_Param2 IS NOT NULL))
BEGIN
EXEC dbo.usp_SPWithParam1And2
END
IF ((@Input_Param1 IS NOT NULL) AND (@Input_Param2 IS NULL))
BEGIN
EXEC dbo.usp_SPWithParam1Only
END
IF ((@Input_Param1 IS NULL) AND (@Input_Param2 IS NOT NULL))
BEGIN
EXEC dbo.usp_SPWithParam2Only
END
IF ((@Input_Param1 IS NULL) AND (@Input_Param2 IS NULL))
BEGIN
EXEC dbo.usp_SPWithoutParam1And2
END
在向我們的負責人介紹之后,他建議我改用CASE STATEMENTS,因為使用IF STATEMENTS是一個壞主意。
我嘗試到處搜索如何以與上面相同的格式使用案例陳述,但無濟於事。 我發現的只是使用CASE STATEMENTS和UPDATE。
如何以類似上面的方式在SQL SERVER中使用CASE STATEMENTS?
嘗試這段代碼。在這里,我將過程名稱(將要執行的過程)存儲在名為@sql
的變量中,最后使用sp_executesql
執行此變量。
CREATE PROCEDURE dbo.usp_SPCaller
@Input_Param1 NVARCHAR(100) = NULL,
@Input_Param2 NVARCHAR(100) = NULL
AS
BEGIN
SET NOCOUNT ON
DECLARE @sql AS NVARCHAR(MAX)
set @sql = case
when ((@Input_Param1 IS NOT NULL) AND (@Input_Param2 IS NOT NULL))
then 'dbo.usp_SPWithParam1And2'
when ((@Input_Param1 IS NOT NULL) AND (@Input_Param2 IS NULL))
then 'dbo.usp_SPWithParam1Only'
when((@Input_Param1 IS NULL) AND (@Input_Param2 IS NOT NULL))
then 'dbo.usp_SPWithParam2Only'
when ((@Input_Param1 IS NULL) AND (@Input_Param2 IS NULL))
then 'dbo.usp_SPWithoutParam1And2'
END
print @sql
EXEC sp_executesql @sql
end
恐怕您的組長是錯的。
引用MSDN :
CASE表達式不能用於控制Transact-SQL語句,語句塊,用戶定義的函數和存儲過程的執行流程。 有關流控制方法的列表,請參見流控制語言(Transact-SQL)。
Transact-SQL流控制語言關鍵字是(那里沒有CASE
):
- BEGIN...END
- RETURN
- BREAK
- TRY...CATCH
- CONTINUE
- WAITFOR
- GOTO label
- WHILE
- IF...ELSE
另一方面,您的查詢可以得到改進 (如果滿足條件,則無需檢查其他IF(s)
:
CREATE PROCEDURE dbo.usp_SPCaller
@Input_Param1 NVARCHAR(100) = NULL,
@Input_Param2 NVARCHAR(100) = NULL
AS
BEGIN
SET NOCOUNT ON
IF ((@Input_Param1 IS NOT NULL) AND (@Input_Param2 IS NOT NULL))
BEGIN
EXEC dbo.usp_SPWithParam1And2
END
ELSE IF ((@Input_Param1 IS NOT NULL) AND (@Input_Param2 IS NULL))
BEGIN
EXEC dbo.usp_SPWithParam1Only
END
ELSE IF ((@Input_Param1 IS NULL) AND (@Input_Param2 IS NOT NULL))
BEGIN
EXEC dbo.usp_SPWithParam2Only
END
ELSE IF ((@Input_Param1 IS NULL) AND (@Input_Param2 IS NULL))
BEGIN
EXEC dbo.usp_SPWithoutParam1And2
END
CASE
綜上所述,有一種方法可以通過動態查詢來強制執行CASE
行為,例如Sushil Sharma發布的方法。
但是有一個陷阱 ! 使用動態查詢(在不需要時)將通過SQL注入為任何潛在的附加程序提供一個攻擊向量,因此在我看來,最好使用簡單的解決方案IF
... ELSE IF
,它可以執行已經預定義的過程。
告訴您的領導者他錯了(也許以更客氣的方式)。 T-SQL中沒有CASE 語句 ,只有一個case 表達式 。 因此,如果您現在擁有的話,請繼續使用它們。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.