![](/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.