sql - CASE vs IF-ELSE-IF vs GOTO 关键字

标签 sql sql-server if-statement case goto

我的应用程序中有一些规则,我已经在我的过程中编写了这些规则的业务逻辑。在创建过程时,我开始知道 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

方法二使用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/

相关文章:

java spring Long[](数组)类型

sql-server - SQL Server 文本数据类型最大长度 = 65,535?

R 使用 if else 语句从列表中删除对象

mysql - 将 MM-DD-YYYY varchar 转换为日期时间

mysql - SQL 查询按月/年统计总条目

sql - 如何使用 Sql :Variable in xquery 从 XML 属性获取值

sql-server - SQL Server 2008磁盘使用问题

sql-server - SQL Server (2005) - "Deleted On"DATETIME 和索引

C++ 检查 float

c - 将值存储为 C 中 if 语句中的字符串