我的应用程序中有一些规则,我已经在我的过程中编写了这些规则的业务逻辑。在创建过程时,我开始知道 CASE
表达式在我的场景中不起作用。所以我尝试了两种方法来执行相同的操作(使用 IF-ELSE-IF
或 GOTO
),如下所示。
方法 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
方法二使用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 表达式吗?如果不是,我的程序中最好使用哪种方法来提高我的代码的性能?
最佳答案
试试这个 -
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
关于sql - CASE vs IF-ELSE-IF vs GOTO 关键字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17377728/