從MSDN docs爲create function
:爲什麼SQL-Server UDF如此有限?
User-defined functions cannot be used to perform actions that modify the database state.
我的問題很簡單 - 爲什麼?
是的,修改數據的UDF可能具有潛在的不需要的副作用。
是的,如果一個UDF被調用幾千次,那麼會有開銷。
但這就是設計和測試的重點 - 確保在部署之前解決這些問題。那麼爲什麼DB廠商堅持要對開發人員施加這些人爲限制?什麼是語言結構的重點,基本上只能用作select
語句的包裝?
這個問題的原因如下:我正在寫一個函數來爲某個唯一的整數ID返回一個GUID。如果已經爲該ID分配了一個GUID,我只需返回它;否則我想要生成一個新的GUID,將它存儲到一個表中,並返回新生成的GUID。 (是的,這聽起來很囉嗦,可能很瘋狂,但是當你將數據發送給另一個開發公司時,他們認爲他們的設計是上帝傳下來的,不能改進,只是微笑點頭,做他們想問的事)。
我知道我可以使用帶輸出參數的存儲過程來獲得相同的結果,但是爲了保存存儲過程的結果,我必須聲明一個新變量。不僅如此,我還必須將我的簡單select
轉換爲插入臨時表的while循環,併爲該循環的每次迭代調用sproc。
如果你需要一些東西來修改數據庫狀態 - 爲什麼不直接使用一個存儲過程,而不是? UDF的目的是做一個快速計算,查找或某物並返回一個值 - 這是他們的目標。他們做得很好。 – 2010-02-25 08:28:29
因爲我想做一些類似'my_udf(my_variable)from my_table',其中my_udf選擇或創建它返回的值(正如我的文章中所解釋的)。使用sproc實現相同的結果會使代碼大10倍。 – 2010-02-25 09:37:34