本質上沒區別。只是函數有如:只能傳回一個變數的限制。而預存程序可以傳回多個。而函數是可以嵌入在sql中使用的,可以在select中調用,而預存程序不行。執行的本質都一樣。
函數限制比較多,例如不能用臨時表,只能用表變量.還有一些函數都不可用等等.而存儲過程的限制相對就比較少
1. 一般來說,存儲過程實現的功能要複雜一點,函數的實現的功能針對性比較強。
2. 對於預存程序來說可以傳回參數,而函數只能傳回值或表物件。
3. 預存程序一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。
4. 當預存程序和函數被執行的時候,SQL Manager會到procedure cache中去取對應的查詢語句,如果在procedure cache裡沒有對應的查詢語句,SQL Manager就會對預存程序和函式進行編譯。
Procedure cache中保存的是執行計劃(execution plan) ,當編譯好之後就執行procedure cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan ,評判的標準一個是這個execution plan可能被使用的頻率;其次是產生這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執行時就不用再編譯了。
預存程序和使用者自訂函數具體的區別
先看定義:
預存程序
預存程序可以使得對資料庫的管理、以及儲存過程
預存程序可以使得對資料庫的管理、以及顯示預存程序及其使用者資訊的工作容易得多。預存程序是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱儲存並作為一個單元處理。預存程序儲存在資料庫內,可由應用程式透過一個呼叫執行,而且允許使用者聲明變數、有條件執行以及其它強大的程式設計功能。
預存程序可包含程式流程、邏輯以及對資料庫的查詢。它們可以接受參數、輸出參數、傳回單一或多個結果集以及傳回值。
可以出於任何使用 SQL 語句的目的來使用預存程序,它具有以下優點:
可以在單一預存程序中執行一系列 SQL 語句。
可以從自己的儲存過程內引用其它儲存過程,這可以簡化一系列複雜語句。
預存程序在創建時即在伺服器上進行編譯,所以執行起來比單一 SQL 語句快。
使用者定義函數
函數是由一個或多個 Transact-SQL 語句組成的子程序,可用於封裝程式碼以便重新使用。 Microsoft? SQL Server? 2000 不會將使用者限制在定義為 Transact-SQL 語言一部分的內建函數上,而是允許使用者建立自己的使用者定義函數。
可使用 CREATE FUNCTION 語句建立、使用 ALTER FUNCTION 語句修改、以及使用 DROP FUNCTION 語句移除使用者定義函數。每個完全合法的使用者定義函數名稱 (database_name.owner_name.function_name) 必須唯一。
必須被授予 CREATE FUNCTION 權限才能建立、修改或移除使用者定義函數。不是擁有者的使用者在 Transact-SQL 語句中使用某個函數之前,必須先給此使用者授予該函數的適當權限。若要建立或變更在 CHECK 約束、DEFAULT 子句或計算列定義中引用使用者定義函數的表,也必須具有函數的 REFERENCES 權限。