我學習函數和存儲過程已經有一段時間了,可是我不知道爲何以及什麼時候應該使用函數或存儲過程。 在我看來,它們看起來同樣,也許是由於我對此有些新手。 程序員
有人能夠告訴我爲何嗎? 數據庫
函數能夠用在select語句中,而過程則不能。 服務器
存儲過程同時接受輸入和輸出參數,而功能僅接受輸入參數。 函數
函數沒法在過程能夠的地方返回text,ntext,image和timestamps類型的值。 工具
函數能夠在建立表中用做用戶定義的數據類型,但過程不能。 學習
***例如:-建立table <tablename>(name varchar(10),salary getsal(name))
spa
這裏的getsal是一個用戶定義的函數,它返回一個薪金類型,在建立表時沒有爲薪金類型分配存儲空間,也沒有執行getsal函數,可是當咱們從該表中獲取某些值時,將執行getsal函數get和return類型做爲結果集返回。 .net
函數是計算值,不能對SQL Server進行永久的環境更改(即,不容許INSERT或UPDATE語句)。 code
若是函數返回標量值,則能夠在SQL語句中內聯使用;若是返回結果集,則能夠將其加入。 對象
註釋總結了答案,這一點值得一提。 感謝@Sean K Anderson:
函數遵循計算機科學的定義,由於它們必須返回一個值,而且不能更改做爲參數(自變量)接收的數據。 函數不容許更改任何內容,必須至少具備一個參數,而且它們必須返回一個值。 存儲的proc沒必要具備參數,能夠更改數據庫對象,也沒必要返回值。
當您要計算並返回供其餘SQL語句使用的值時,編寫一個用戶定義的函數; 當您想要對一組可能很複雜的SQL語句進行分組時,編寫一個存儲過程。 畢竟,這是兩個大相徑庭的用例!
要決定什麼時候使用如下幾點可能會有所幫助-
存儲過程沒法返回表變量,而函數能夠作到這一點。
您可使用存儲過程來更改服務器環境參數,而不能使用函數。
乾杯
用戶定義函數是SQL Server程序員可用的重要工具。 您能夠像這樣在SQL語句中內聯使用它
SELECT a, lookupValue(b), c FROM customers
其中lookupValue
將是UDF。 使用存儲過程時,這種功能是不可能的。 同時,您不能在UDF中執行某些操做。 這裏要記住的基本內容是UDF:
存儲過程能夠完成那些事情。
對我來講,UDF的內聯用法是UDF的最重要用法。