案例vs IF-ELSE-IF vs GOTO关键字

问题描述 投票:3回答:3

我在我的应用程序中有一些规则,并且我在程序中编写了该规则的业务逻辑。在创建过程时,我知道CASE表达式在我的场景中不起作用。因此,我尝试了两种方法来执行相同的操作(使用IF-ELSE-IFGOTO),如下所示。

方法1使用IF-ELSE-IF条件:

DECLARE @V_RuleId SMALLINT;

IF (@V_RuleId = 1) 
BEGIN 
    /*My business logic*/
END
ELSE IF (@V_RuleId = 2) 
BEGIN 
    /*My business logic*/
END
ELSE IF (@V_RuleId = 3) 
BEGIN 
    /*My business logic*/
END
/* 
...
...
...
...*/
ELSE IF (@V_RuleId = 19) 
BEGIN 
    /*My business logic*/
END
ELSE IF (@V_RuleId = 20) 
BEGIN 
    /*My business logic*/
END

方法2使用GOTO语句:

DECLARE @V_RuleId SMALLINT, @V_Temp VARCHAR(100);

SET @V_Temp = 'GOTO RULE' + CONVERT(VARCHAR, @V_RuleId);
EXECUTE sp_executesql @V_Temp;

RULE1: 
BEGIN 
    /*My business logic*/
END

RULE2: 
BEGIN 
    /*My business logic*/
END

RULE3: 
BEGIN 
    /*My business logic*/
END

/* 
...
...
...
...*/

RULE19: 
BEGIN 
    /*My business logic*/
END

RULE20: 
BEGIN 
    /*My business logic*/
END

今天我有20条规则。将来可以增加到任何数量。如果我可以使用CASE表达式,那么我对性能没有任何问题,但是我不能这样做,因此我担心过程的性能。

还需要注意的是,此过程将由应用程序非常频繁地执行。

我的问题是:

在我的过程中有没有使用CASE表达式的方法?如果没有,哪种方法最好在我的过程中使用以提高代码的性能?

sql sql-server if-statement case goto
3个回答
3
投票

尝试这个-

DECLARE @V_RuleId SMALLINT
SELECT @V_RuleId = 1;

DECLARE @temp TABLE
(
      RuleID INT
    , Query NVARCHAR(MAX)
)

INSERT INTO @temp (RuleID, Query)
VALUES 
    (1, 'EXEC dbo.usp_test1;'),
    (2, 'CREATE TABLE dbo.Table1 (ID INT);'),
    (3, 'DROP TABLE dbo.Table1;')

DECLARE @SQL NVARCHAR(MAX)

SELECT @SQL = Query 
FROM @temp
WHERE RuleID = @V_RuleId

PRINT @SQL

EXEC sys.sp_executesql @SQL

1
投票

[就像您说的,我认为CASE表达式在这里不起作用。 CASE仅返回一个值。我假设您的过程将返回多个值。我喜欢您的GOTO方法。您应该尝试几千条规则,看看性能确实是一个问题。


0
投票

如果可能的话,我将在Domain层(或应用程序的Buisness层)中处理该逻辑。因为如果将来规则数量增加到大量,您最终会遇到问题(没有人能够读取该大的SQL语句)。

© www.soinside.com 2019 - 2024. All rights reserved.