2013-06-20 54 views
0

StoplightStatus評估的確定性函數

1 - Red 
2 - Yellow 
3 - Green 

由於這是一個確定性函數...

CREATE FUNCTION dbo.udf_StoplightStatusRed() 
RETURNS TINYINT 
WITH SCHEMABINDING 
AS 
    RETURN CAST(1 as TINYINT) 
END 

它是安全的做...

SELECT 
    [Status] = CASE StoplightStatusID WHEN dbo.udf_StoplightStatusRed() THEN 1 ELSE 0 END 
FROM dbo.StoplightAudit 
WHERE StopLightStatusID = dbo.udf_StoplightStatusRed() 

查詢本身沒有按我知道,這沒什麼意義。我只是想確定,如果我這樣做,我的功能不被評估每一行。

我需要加入到很多其它表來獲取更多的信息。最好先在CTE中獲得所有的審計ID並加入,或者不要緊,因爲這些函數是確定性的?

+0

檢查執行計劃。但是,SQL Server知道哪些功能是確定的,我100%確信它爲一個常數任何不依賴於行的值優化了。 – jods

回答

0

你的功能應該是確定的:

確定性函數總是返回相同的結果,他們被稱爲用一組特定的輸入值,並給出了數據庫的相同狀態的任何時間。每次使用特定的一組輸入值調用非確定性函數時,即使數據庫訪問的數據庫狀態保持不變,也可能返回不同的結果。

數據庫引擎自動分析的Transact-SQL函數的體並評估函數是否是確定性的。例如,如果該函數調用是非確定性的其他功能,或者如果函數調用擴展存儲過程,則該數據庫引擎標記用作非確定性。對於公共語言運行時(CLR)函數,數據庫引擎依賴函數的作者將函數標記爲確定性或不使用SqlFunction自定義屬性。