繁体   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