2010-03-15 61 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函數 - 它爲什麼不選擇功能?

這似乎是負責任的選擇不當的分佈。