2010-03-15 60 views
2

我在SQL Server 2005中维护一个函数,它基于整数输入参数需要调用不同的函数,例如SQL Server函数中大if子句的性能改进

IF @rule_id = 1 
    -- execute function 1 
ELSE IF @rule_id = 2 
    -- execute function 2 
ELSE IF @rule_id = 3 
    ... etc 

的问题是,有一个公平的一些规则(约100),虽然上面是相当可读的,它的性能是不是很大。目前它是作为一系列IF执行的,它执行的是二进制的快捷方式,但是读取和维护起来相当不愉快。对于表现良好且相当可维护的东西,有没有其他想法?

+2

最终调用的函数有多相似? – 2010-03-15 21:49:21

+0

函数参数都是一样的,但它们内部完成的工作是非常不同的。 – 2010-03-15 22:06:17

+0

'CASE/WHEN'布局可能更具性能,但解​​析器可能已经在内部对其进行了优化。我个人对“CASE”的偏好是在每个WHEN块之间留出一条空白行,以使其更具可读性。 – devstuff 2010-03-16 03:26:53

回答

3

我建议你生成的代码编程,例如。通过XML + XSLT。所产生的T-SQL将与现在一样,但维护它会更容易(添加/删除功能)。

功能里面没有太多的选择,使用IF几乎是唯一的解决方案。你不能在函数中做动态SQL(你不能调用exec)。如果它是一个存储过程,那么你有更多的libery,你可以使用动态SQL,并有一个像查找表招数:select @function = function from table where rule_id = @rule_id; exec sp_executesql @function;

2

你可以改变它,使它的高层功能作为一个字符串?我通常会建议不要这样的动态SQL,如果你退后一步,看看整体设计,可能会有更好的方法......但是在这里已知的情况下,你可能会发现一个很好的例外情况。

例如:

set @functionCall = 'functionRootName' + @rule_id 
exec @functionCall 
0

无论是调用SQL函数 - 它为什么不选择功能?

这似乎是负责任的选择不当的分布。