3

我的应用程序中有一些规则,并且我已经在我的程序中编写了这些规则的业务逻辑。在创建过程时,我开始知道该CASE表达式在我的场景中不起作用。所以我尝试了两种方法来执行相同的操作(使用IF-ELSE-IFor 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 表达式?如果不是,在我的程序中最好使用哪种方法来提高我的代码的性能?

4

3 回答 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
于 2013-07-01T05:07:59.563 回答
1

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

我还有另一个建议。您可以将所有代码放在一个表中并将它们作为动态 SQL 运行。它们不会是真正动态的,因为它们总是相同的,因此 SQL Server 仍然可以缓存这些执行计划。然后案例查找将是您的表索引,这非常快。我不确定它是否比这种GOTO方法更快。

总之,请用荒谬的规则尝试一下,让我们知道你的结果是什么。

于 2013-06-29T16:22:00.753 回答
0

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

您应该检查面向对象的 SOLID 原则,尤其是 OpenClose 原则。

从理论上讲,您可以使用这样的案例(取决于正在执行的规则):

DECLARE @rule  int = 1;
SELECT CASE @rule
WHEN 1 THEN
@rule
WHEN 2 THEN 
@rule
END 

但是,因为 T-SQL 不是一种过程语言,如果可能的话,也许您应该尝试将规则存储在表中并从集合中返回规则,而不是使用过程逻辑(以获得更好的性能)。

于 2013-06-29T10:19:42.903 回答