簡體   English   中英

在存儲過程中使用CASE語句

[英]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 表達式 因此,如果您現在擁有的話,請繼續使用它們。

你的領導是錯誤的。

“ CASE表達式不能用於控制Transact-SQL語句,語句塊,用戶定義的函數和存儲過程的執行流程。”

參考

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM