本質(zhì)上沒區(qū)別。只是函數(shù)有如:只能返回一個(gè)變量的限制。而存儲(chǔ)過程可以返回多個(gè)。而函數(shù)是可以嵌入在sql中使用的,可以在select中調(diào)用,而存儲(chǔ)過程不行。執(zhí)行的本質(zhì)都一樣。
函數(shù)限制比較多,比如不能用臨時(shí)表,只能用表變量.還有一些函數(shù)都不可用等等.而存儲(chǔ)過程的限制相對(duì)就比較少
1. 一般來(lái)說(shuō),存儲(chǔ)過程實(shí)現(xiàn)的功能要復(fù)雜一點(diǎn),而函數(shù)的實(shí)現(xiàn)的功能針對(duì)性比較強(qiáng)。
2. 對(duì)于存儲(chǔ)過程來(lái)說(shuō)可以返回參數(shù),而函數(shù)只能返回值或者表對(duì)象。
3. 存儲(chǔ)過程一般是作為一個(gè)獨(dú)立的部分來(lái)執(zhí)行,而函數(shù)可以作為查詢語(yǔ)句的一個(gè)部分來(lái)調(diào)用,由于函數(shù)可以返回一個(gè)表對(duì)象,因此它可以在查詢語(yǔ)句中位于FROM關(guān)鍵字的后面。
4. 當(dāng)存儲(chǔ)過程和函數(shù)被執(zhí)行的時(shí)候,SQL Manager會(huì)到PRocedure cache中去取相應(yīng)的查詢語(yǔ)句,如果在procedure cache里沒有相應(yīng)的查詢語(yǔ)句,SQL Manager就會(huì)對(duì)存儲(chǔ)過程和函數(shù)進(jìn)行編譯。
Procedure cache中保存的是執(zhí)行計(jì)劃 (execution plan) ,當(dāng)編譯好之后就執(zhí)行procedure cache中的execution plan,之后SQL SERVER會(huì)根據(jù)每個(gè)execution plan的實(shí)際情況來(lái)考慮是否要在cache中保存這個(gè)plan,評(píng)判的標(biāo)準(zhǔn)一個(gè)是這個(gè)execution plan可能被使用的頻率;其次是生成這個(gè)plan的代價(jià),也就是編譯的耗時(shí)。保存在cache中的plan在下次執(zhí)行時(shí)就不用再編譯了。
存儲(chǔ)過程和用戶自定義函數(shù)具體的區(qū)別
先看定義:
存儲(chǔ)過程
存儲(chǔ)過程可以使得對(duì)數(shù)據(jù)庫(kù)的管理、以及顯示關(guān)于數(shù)據(jù)庫(kù)及其用戶信息的工作容易得多。存儲(chǔ)過程是 SQL 語(yǔ)句和可選控制流語(yǔ)句的預(yù)編譯集合,以一個(gè)名稱存儲(chǔ)并作為一個(gè)單元處理。存儲(chǔ)過程存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi),可由應(yīng)用程序通過一個(gè)調(diào)用執(zhí)行,而且允許用戶聲明變量、有條件執(zhí)行以及其它強(qiáng)大的編程功能。
存儲(chǔ)過程可包含程序流、邏輯以及對(duì)數(shù)據(jù)庫(kù)的查詢。它們可以接受參數(shù)、輸出參數(shù)、返回單個(gè)或多個(gè)結(jié)果集以及返回值。
可以出于任何使用 SQL 語(yǔ)句的目的來(lái)使用存儲(chǔ)過程,它具有以下優(yōu)點(diǎn):
可以在單個(gè)存儲(chǔ)過程中執(zhí)行一系列 SQL 語(yǔ)句。
可以從自己的存儲(chǔ)過程內(nèi)引用其它存儲(chǔ)過程,這可以簡(jiǎn)化一系列復(fù)雜語(yǔ)句。
存儲(chǔ)過程在創(chuàng)建時(shí)即在服務(wù)器上進(jìn)行編譯,所以執(zhí)行起來(lái)比單個(gè) SQL 語(yǔ)句快。
用戶定義函數(shù)
函數(shù)是由一個(gè)或多個(gè) Transact-SQL 語(yǔ)句組成的子程序,可用于封裝代碼以便重新使用。Microsoft? SQL Server? 2000 并不將用戶限制在定義為 Transact-SQL 語(yǔ)言一部分的內(nèi)置函數(shù)上,而是允許用戶創(chuàng)建自己的用戶定義函數(shù)。
可使用 CREATE FUNCTION 語(yǔ)句創(chuàng)建、使用 ALTER FUNCTION 語(yǔ)句修改、以及使用 DROP FUNCTION 語(yǔ)句除去用戶定義函數(shù)。每個(gè)完全合法的用戶定義函數(shù)名 (database_name.owner_name.function_name) 必須唯一。
必須被授予 CREATE FUNCTION 權(quán)限才能創(chuàng)建、修改或除去用戶定義函數(shù)。不是所有者的用戶在 Transact-SQL 語(yǔ)句中使用某個(gè)函數(shù)之前,必須先給此用戶授予該函數(shù)的適當(dāng)權(quán)限。若要?jiǎng)?chuàng)建或更改在 CHECK 約束、DEFAULT 子句或計(jì)算列定義中引用用戶定義函數(shù)的表,還必須具有函數(shù)的 REFERENCES 權(quán)限。
在函數(shù)中,區(qū)別處理導(dǎo)致刪除語(yǔ)句并且繼續(xù)在諸如觸發(fā)器或存儲(chǔ)過程等模式中的下一語(yǔ)句的 Transact-SQL 錯(cuò)誤。在函數(shù)中,上述錯(cuò)誤會(huì)導(dǎo)致停止執(zhí)行函數(shù)。接下來(lái)該操作導(dǎo)致停止喚醒調(diào)用該函數(shù)的語(yǔ)句。
用戶定義函數(shù)的類型
SQL Server 2000 支持三種用戶定義函數(shù):
標(biāo)量函數(shù)
內(nèi)嵌表值函數(shù)
多語(yǔ)句表值函數(shù)
用戶定義函數(shù)采用零個(gè)或更多的輸入?yún)?shù)并返回標(biāo)量值或表。函數(shù)最多可以有 1024 個(gè)輸入?yún)?shù)。當(dāng)函數(shù)的參數(shù)有默認(rèn)值時(shí),調(diào)用該函數(shù)時(shí)必須指定默認(rèn) DEFAULT 關(guān)鍵字才能獲取默認(rèn)值。該行為不同于在存儲(chǔ)過程中含有默認(rèn)值的參數(shù),而在這些存儲(chǔ)過程中省略該函數(shù)也意味著省略默認(rèn)值。用戶定義函數(shù)不支持輸出參數(shù)。
標(biāo)量函數(shù)返回在 RETURNS 子句中定義的類型的單個(gè)數(shù)據(jù)值。可以使用所有標(biāo)量數(shù)據(jù)類型,包括 bigint 和 sql_variant。不支持 timestamp 數(shù)據(jù)類型、用戶定義數(shù)據(jù)類型和非標(biāo)量類型(如 table 或 cursor)。在 BEGIN...END 塊中定義的函數(shù)主體包含返回該值的 Transact-SQL 語(yǔ)句系列。返回類型可以是除 text、ntext、image、cursor 和 timestamp 之外的任何數(shù)據(jù)類型。
表值函數(shù)返回 table。對(duì)于內(nèi)嵌表值函數(shù),沒有函數(shù)主體;表是單個(gè) SELECT 語(yǔ)句的結(jié)果集。對(duì)于多語(yǔ)句表值函數(shù),在 BEGIN...END 塊中定義的函數(shù)主體包含 TRANSACT-SQL 語(yǔ)句,這些語(yǔ)句可生成行并將行插入將返回的表中。有關(guān)內(nèi)嵌表值函數(shù)的更多信息,請(qǐng)參見內(nèi)嵌用戶定義函數(shù)。有關(guān)表值函數(shù)的更多信息,請(qǐng)參見返回 table 數(shù)據(jù)類型的用戶定義函數(shù)。
BEGIN...END 塊中的語(yǔ)句不能有任何副作用。函數(shù)副作用是指對(duì)具有函數(shù)外作用域(例如數(shù)據(jù)庫(kù)表的修改)的資源狀態(tài)的任何永久性更改。函數(shù)中的語(yǔ)句唯一能做的更改是對(duì)函數(shù)上的局部對(duì)象(如局部游標(biāo)或局部變量)的更改。不能在函數(shù)中執(zhí)行的操作包括:對(duì)數(shù)據(jù)庫(kù)表的修改,對(duì)不在函數(shù)上的局部游標(biāo)進(jìn)行操作,發(fā)送電子郵件,嘗試修改目錄,以及生成返回至用戶的結(jié)果集。
函數(shù)中的有效語(yǔ)句類型包括:
DECLARE 語(yǔ)句,該語(yǔ)句可用于定義函數(shù)局部的數(shù)據(jù)變量和游標(biāo)。
為函數(shù)局部對(duì)象賦值,如使用 SET 給標(biāo)量和表局部變量賦值。
游標(biāo)操作,該操作引用在函數(shù)中聲明、打開、關(guān)閉和釋放的局部游標(biāo)。不允許使用 FETCH 語(yǔ)句將數(shù)據(jù)返回到客戶端。僅允許使用 FETCH 語(yǔ)句通過 INTO 子句給局部變量賦值。
控制流語(yǔ)句。
SELECT 語(yǔ)句,該語(yǔ)句包含帶有表達(dá)式的選擇列表,其中的表達(dá)式將值賦予函數(shù)的局部變量。
INSERT、UPDATE 和 DELETE 語(yǔ)句,這些語(yǔ)句修改函數(shù)的局部 table 變量。
EXECUTE 語(yǔ)句,該語(yǔ)句調(diào)用擴(kuò)展存儲(chǔ)過程。
在查詢中指定的函數(shù)的實(shí)際執(zhí)行次數(shù)在優(yōu)化器生成的執(zhí)行計(jì)劃間可能不同。示例為 WHERE 子句中的子查詢喚醒調(diào)用的函數(shù)。子查詢及其函數(shù)執(zhí)行的次數(shù)會(huì)因優(yōu)化器選擇的訪問路徑而異。
用戶定義函數(shù)中不允許使用會(huì)對(duì)每個(gè)調(diào)用返回不同數(shù)據(jù)的內(nèi)置函數(shù)。用戶定義函數(shù)中不允許使用以下內(nèi)置函數(shù):
@@CONNECTIONS @@PACK_SENT GETDATE
@@CPU_BUSY @@PACKET_ERRORS GetUTCDate
@@IDLE @@TIMETICKS NEWID
@@IO_BUSY @@TOTAL_ERRORS RAND
@@MAX_CONNECTIONS @@TOTAL_READ TEXTPTR
@@PACK_RECEIVED @@TOTAL_WRITE
架構(gòu)綁定函數(shù)
CREATE FUNCTION 支持 SCHEMABINDING 子句,后者可將函數(shù)綁定到它引用的任何對(duì)象(如表、視圖和其它用戶定義函數(shù))的架構(gòu)。嘗試對(duì)架構(gòu)綁定函數(shù)所引用的任何對(duì)象執(zhí)行 ALTER 或 DROP 都將失敗。
必須滿足以下條件才能在 CREATE FUNCTION 中指定 SCHEMABINDING:
該函數(shù)所引用的所有視圖和用戶定義函數(shù)必須是綁定到架構(gòu)的。
該函數(shù)所引用的所有對(duì)象必須與函數(shù)位于同一數(shù)據(jù)庫(kù)中。必須使用由一部分或兩部分構(gòu)成的名稱來(lái)引用對(duì)象。
必須具有對(duì)該函數(shù)中引用的所有對(duì)象(表、視圖和用戶定義函數(shù))的 REFERENCES 權(quán)限。
可使用 ALTER FUNCTION 刪除架構(gòu)綁定。ALTER FUNCTION 語(yǔ)句將通過不帶 WITH SCHEMABINDING 指定函數(shù)來(lái)重新定義函數(shù)。
調(diào)用用戶定義函數(shù)
當(dāng)調(diào)用標(biāo)量用戶定義函數(shù)時(shí),必須提供至少由兩部分組成的名稱:
SELECT *, MyUser.MyScalarFunction()FROM MyTable可以使用一個(gè)部分構(gòu)成的名稱調(diào)用表值函數(shù):
SELECT *FROM MyTableFunction()然而,當(dāng)調(diào)用返回表的 SQL Server 內(nèi)置函數(shù)時(shí),必須將前綴 :: 添加至函數(shù)名:
SELECT * FROM ::fn_helpcollations()可在 Transact-SQL 語(yǔ)句中所允許的函數(shù)返回的相同數(shù)據(jù)類型表達(dá)式所在的任何位置引用標(biāo)量函數(shù),包括計(jì)算列和 CHECK 約束定義。例如,下面的語(yǔ)句創(chuàng)建一個(gè)返回 decimal 的簡(jiǎn)單函數(shù):
CREATE FUNCTION CubicVolume-- Input dimensions in centimeters (@CubeLength decimal(4,1), @CubeWidth decimal(4,1), @CubeHeight decimal(4,1) )RETURNS decimal(12,3) -- Cubic Centimeters.ASBEGIN RETURN ( @CubeLength * @CubeWidth * @CubeHeight )END然后可以在允許整型表達(dá)式的任何地方(如表的計(jì)算列中)使用該函數(shù):
CREATE TABLE Bricks ( BrickPartNmbr int PRIMARY KEY, BrickColor nchar(20), BrickHeight decimal(4,1), BrickLength decimal(4,1), BrickWidth decimal(4,1), BrickVolume AS ( dbo.CubicVolume(BrickHeight, BrickLength, BrickWidth) ) )dbo.CubicVolume 是返回標(biāo)量值的用戶定義函數(shù)的一個(gè)示例。RETURNS 子句定義由該函數(shù)返回的值的標(biāo)量數(shù)據(jù)類型。BEGIN...END 塊包含一個(gè)或多個(gè)執(zhí)行該函數(shù)的 Transact-SQL 語(yǔ)句。該函數(shù)中的每個(gè) RETURN 語(yǔ)句都必須具有一個(gè)參數(shù),可返回具有在 RETURNS 子句中指定的數(shù)據(jù)類型(或可隱性轉(zhuǎn)換為 RETURNS 中指定類型的數(shù)據(jù)類型)的數(shù)據(jù)值。RETURN 參數(shù)的值是該函數(shù)返回的值
新聞熱點(diǎn)
疑難解答
圖片精選