美女脱光衣服的视频网站-亚洲欧洲日本在线色-国产又粗又猛又爽又黄的aa-日韩精品人妻一区二区在线看-青春草在线精品视频-色哟哟成人天堂av在线观看-日本不卡码一区二区三区-日本视频一二区三区-在线免费观看日本网址

淺談網(wǎng)站制作中存儲(chǔ)過(guò)程與函數(shù)的區(qū)別

2016-01-21 11:20:03 欄目:網(wǎng)站建設(shè) 查看(3045 )

在網(wǎng)站制作中經(jīng)常有人提起用存儲(chǔ)過(guò)程和函數(shù),其實(shí)這是決定了數(shù)據(jù)從數(shù)據(jù)庫(kù)調(diào)取和返回的時(shí)間問(wèn)題,我認(rèn)為兩者在本質(zhì)上沒(méi)區(qū)別。只是函數(shù)有如:只能返回一個(gè)變量的限制而存儲(chǔ)過(guò)程可以返回多個(gè)。而函數(shù)是可以嵌入在sql中使用的,可以在select中調(diào)用,而存儲(chǔ)過(guò)程不行。執(zhí)行的本質(zhì)都一樣。 


      函數(shù)限制比較多,比如不能用臨時(shí)表,只能用表變量.還有一些函數(shù)都不可用等等.而存儲(chǔ)過(guò)程的限制相對(duì)就比較少。
       1.     一般來(lái)說(shuō),存儲(chǔ)過(guò)程實(shí)現(xiàn)的功能要復(fù)雜一點(diǎn),而函數(shù)的實(shí)現(xiàn)的功能針對(duì)性比較強(qiáng)。
       2.     對(duì)于存儲(chǔ)過(guò)程來(lái)說(shuō)可以返回參數(shù),而函數(shù)只能返回值或者表對(duì)象。
       3.     存儲(chǔ)過(guò)程一般是作為一個(gè)獨(dú)立的部分來(lái)執(zhí)行,而函數(shù)可以作為查詢(xún)語(yǔ)句的一個(gè)部分來(lái)調(diào)用,由于函數(shù)可以返回一個(gè)表對(duì)象,因此它可以在查詢(xún)語(yǔ)句中位于FROM關(guān)鍵字的后面。
       4.     當(dāng)存儲(chǔ)過(guò)程和函數(shù)被執(zhí)行的時(shí)候,SQL Manager會(huì)到PRocedure cache中去取相應(yīng)的查詢(xún)語(yǔ)句,如果在procedure cache里沒(méi)有相應(yīng)的查詢(xún)語(yǔ)句,SQL Manager就會(huì)對(duì)存儲(chǔ)過(guò)程和函數(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ǔ)過(guò)程和用戶(hù)自定義函數(shù)具體的區(qū)別 

先看定義:存儲(chǔ)過(guò)程
存儲(chǔ)過(guò)程可以使得對(duì)數(shù)據(jù)庫(kù)的管理、以及顯示關(guān)于數(shù)據(jù)庫(kù)及其用戶(hù)信息的工作容易得多。存儲(chǔ)過(guò)程是 SQL 語(yǔ)句和可選控制流語(yǔ)句的預(yù)編譯集合,以一個(gè)名稱(chēng)存儲(chǔ)并作為一個(gè)單元處理。存儲(chǔ)過(guò)程存儲(chǔ)在數(shù)據(jù)庫(kù)內(nèi),可由應(yīng)用程序通過(guò)一個(gè)調(diào)用執(zhí)行,而且允許用戶(hù)聲明變量、有條件執(zhí)行以及其它強(qiáng)大的編程功能。

存儲(chǔ)過(guò)程可包含程序流、邏輯以及對(duì)數(shù)據(jù)庫(kù)的查詢(xún)。它們可以接受參數(shù)、輸出參數(shù)、返回單個(gè)或多個(gè)結(jié)果集以及返回值。

可以出于任何使用 SQL 語(yǔ)句的目的來(lái)使用存儲(chǔ)過(guò)程,它具有以下優(yōu)點(diǎn):

可以在單個(gè)存儲(chǔ)過(guò)程中執(zhí)行一系列 SQL 語(yǔ)句。

可以從自己的存儲(chǔ)過(guò)程內(nèi)引用其它存儲(chǔ)過(guò)程,這可以簡(jiǎn)化一系列復(fù)雜語(yǔ)句。

存儲(chǔ)過(guò)程在創(chuàng)建時(shí)即在服務(wù)器上進(jìn)行編譯,所以執(zhí)行起來(lái)比單個(gè) SQL 語(yǔ)句快。 
用戶(hù)定義函數(shù)
函數(shù)是由一個(gè)或多個(gè) Transact-SQL 語(yǔ)句組成的子程序,可用于封裝代碼以便重新使用。Microsoft? SQL Server? 2000 并不將用戶(hù)限制在定義為 Transact-SQL 語(yǔ)言一部分的內(nèi)置函數(shù)上,而是允許用戶(hù)創(chuàng)建自己的用戶(hù)定義函數(shù)。

可使用 CREATE FUNCTION 語(yǔ)句創(chuàng)建、使用 ALTER FUNCTION 語(yǔ)句修改、以及使用 DROP FUNCTION 語(yǔ)句除去用戶(hù)定義函數(shù)。每個(gè)完全合法的用戶(hù)定義函數(shù)名 (database_name.owner_name.function_name) 必須唯一。

必須被授予 CREATE FUNCTION 權(quán)限才能創(chuàng)建、修改或除去用戶(hù)定義函數(shù)。不是所有者的用戶(hù)在 Transact-SQL 語(yǔ)句中使用某個(gè)函數(shù)之前,必須先給此用戶(hù)授予該函數(shù)的適當(dāng)權(quán)限。若要?jiǎng)?chuàng)建或更改在 CHECK 約束、DEFAULT 子句或計(jì)算列定義中引用用戶(hù)定義函數(shù)的表,還必須具有函數(shù)的 REFERENCES 權(quán)限。

在函數(shù)中,區(qū)別處理導(dǎo)致刪除語(yǔ)句并且繼續(xù)在諸如觸發(fā)器或存儲(chǔ)過(guò)程等模式中的下一語(yǔ)句的 Transact-SQL 錯(cuò)誤。在函數(shù)中,上述錯(cuò)誤會(huì)導(dǎo)致停止執(zhí)行函數(shù)。接下來(lái)該操作導(dǎo)致停止喚醒調(diào)用該函數(shù)的語(yǔ)句。

用戶(hù)定義函數(shù)的類(lèi)型
SQL Server 2000 支持三種用戶(hù)定義函數(shù):

標(biāo)量函數(shù)
內(nèi)嵌表值函數(shù)
多語(yǔ)句表值函數(shù) 
用戶(hù)定義函數(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ǔ)過(guò)程中含有默認(rèn)值的參數(shù),而在這些存儲(chǔ)過(guò)程中省略該函數(shù)也意味著省略默認(rèn)值。用戶(hù)定義函數(shù)不支持輸出參數(shù)。

標(biāo)量函數(shù)返回在 RETURNS 子句中定義的類(lèi)型的單個(gè)數(shù)據(jù)值。可以使用所有標(biāo)量數(shù)據(jù)類(lèi)型,包括 bigint 和 sql_variant。不支持 timestamp 數(shù)據(jù)類(lèi)型、用戶(hù)定義數(shù)據(jù)類(lèi)型和非標(biāo)量類(lèi)型(如 table 或 cursor)。在 BEGIN...END 塊中定義的函數(shù)主體包含返回該值的 Transact-SQL 語(yǔ)句系列。返回類(lèi)型可以是除 text、ntext、image、cursor 和 timestamp 之外的任何數(shù)據(jù)類(lèi)型。

表值函數(shù)返回 table。對(duì)于內(nèi)嵌表值函數(shù),沒(méi)有函數(shù)主體;表是單個(gè) SELECT 語(yǔ)句的結(jié)果集。對(duì)于多語(yǔ)句表值函數(shù),在 BEGIN...END 塊中定義的函數(shù)主體包含 TRANSACT-SQL 語(yǔ)句,這些語(yǔ)句可生成行并將行插入將返回的表中。有關(guān)內(nèi)嵌表值函數(shù)的更多信息,請(qǐng)參見(jiàn)內(nèi)嵌用戶(hù)定義函數(shù)。有關(guān)表值函數(shù)的更多信息,請(qǐng)參見(jiàn)返回 table 數(shù)據(jù)類(lèi)型的用戶(hù)定義函數(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ā)送電子郵件,嘗試修改目錄,以及生成返回至用戶(hù)的結(jié)果集。

函數(shù)中的有效語(yǔ)句類(lèi)型包括:

DECLARE 語(yǔ)句,該語(yǔ)句可用于定義函數(shù)局部的數(shù)據(jù)變量和游標(biāo)。

為函數(shù)局部對(duì)象賦值,如使用 SET 給標(biāo)量和表局部變量賦值。

游標(biāo)操作,該操作引用在函數(shù)中聲明、打開(kāi)、關(guān)閉和釋放的局部游標(biāo)。不允許使用 FETCH 語(yǔ)句將數(shù)據(jù)返回到客戶(hù)端。僅允許使用 FETCH 語(yǔ)句通過(guò) INTO 子句給局部變量賦值。

控制流語(yǔ)句。

SELECT 語(yǔ)句,該語(yǔ)句包含帶有表達(dá)式的選擇列表,其中的表達(dá)式將值賦予函數(shù)的局部變量。

INSERT、UPDATE 和 DELETE 語(yǔ)句,這些語(yǔ)句修改函數(shù)的局部 table 變量。

EXECUTE 語(yǔ)句,該語(yǔ)句調(diào)用擴(kuò)展存儲(chǔ)過(guò)程。 
在查詢(xún)中指定的函數(shù)的實(shí)際執(zhí)行次數(shù)在優(yōu)化器生成的執(zhí)行計(jì)劃間可能不同。示例為 WHERE 子句中的子查詢(xún)喚醒調(diào)用的函數(shù)。子查詢(xún)及其函數(shù)執(zhí)行的次數(shù)會(huì)因優(yōu)化器選擇的訪問(wèn)路徑而異。

用戶(hù)定義函數(shù)中不允許使用會(huì)對(duì)每個(gè)調(diào)用返回不同數(shù)據(jù)的內(nèi)置函數(shù)。用戶(hù)定義函數(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ì)象(如表、視圖和其它用戶(hù)定義函數(shù))的架構(gòu)。嘗試對(duì)架構(gòu)綁定函數(shù)所引用的任何對(duì)象執(zhí)行 ALTER 或 DROP 都將失敗。

必須滿(mǎn)足以下條件才能在 CREATE FUNCTION 中指定 SCHEMABINDING:

該函數(shù)所引用的所有視圖和用戶(hù)定義函數(shù)必須是綁定到架構(gòu)的。

該函數(shù)所引用的所有對(duì)象必須與函數(shù)位于同一數(shù)據(jù)庫(kù)中。必須使用由一部分或兩部分構(gòu)成的名稱(chēng)來(lái)引用對(duì)象。

必須具有對(duì)該函數(shù)中引用的所有對(duì)象(表、視圖和用戶(hù)定義函數(shù))的 REFERENCES 權(quán)限。 
可使用 ALTER FUNCTION 刪除架構(gòu)綁定。ALTER FUNCTION 語(yǔ)句將通過(guò)不帶 WITH SCHEMABINDING 指定函數(shù)來(lái)重新定義函數(shù)。

調(diào)用用戶(hù)定義函數(shù)
當(dāng)調(diào)用標(biāo)量用戶(hù)定義函數(shù)時(shí),必須提供至少由兩部分組成的名稱(chēng):

SELECT *, MyUser.MyScalarFunction()FROM MyTable可以使用一個(gè)部分構(gòu)成的名稱(chēng)調(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ù)類(lèi)型表達(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)量值的用戶(hù)定義函數(shù)的一個(gè)示例。RETURNS 子句定義由該函數(shù)返回的值的標(biāo)量數(shù)據(jù)類(lèi)型。BEGIN...END 塊包含一個(gè)或多個(gè)執(zhí)行該函數(shù)的 Transact-SQL 語(yǔ)句。該函數(shù)中的每個(gè) RETURN 語(yǔ)句都必須具有一個(gè)參數(shù),可返回具有在 RETURNS 子句中指定的數(shù)據(jù)類(lèi)型(或可隱性轉(zhuǎn)換為 RETURNS 中指定類(lèi)型的數(shù)據(jù)類(lèi)型)的數(shù)據(jù)值。RETURN 參數(shù)的值是該函數(shù)返回的值

與我們的項(xiàng)目經(jīng)理聯(lián)系
掃二維碼與項(xiàng)目經(jīng)理溝通

我們?cè)谖⑿派?4小時(shí)期待你的聲音

解答本文疑問(wèn)/技術(shù)咨詢(xún)/運(yùn)營(yíng)咨詢(xún)/技術(shù)建議/互聯(lián)網(wǎng)交流

轉(zhuǎn)載請(qǐng)注明出處:淺談網(wǎng)站制作中存儲(chǔ)過(guò)程與函數(shù)的區(qū)別 - 益眾網(wǎng)絡(luò)
分享:
標(biāo)簽: