我在我的应用程序中有一些规则,并且我在程序中编写了该规则的业务逻辑。在创建过程时,我知道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
方法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表达式的方法?如果没有,哪种方法最好在我的过程中使用以提高代码的性能?
尝试这个-
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
[就像您说的,我认为CASE
表达式在这里不起作用。 CASE
仅返回一个值。我假设您的过程将返回多个值。我喜欢您的GOTO
方法。您应该尝试几千条规则,看看性能确实是一个问题。
如果可能的话,我将在Domain层(或应用程序的Buisness层)中处理该逻辑。因为如果将来规则数量增加到大量,您最终会遇到问题(没有人能够读取该大的SQL语句)。