亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb

首頁 > 開發 > 綜合 > 正文

存儲過程與函數的區別

2024-07-21 02:44:42
字體:
來源:轉載
供稿:網友

  本質上沒區別。只是函數有如:只能返回一個變量的限制。而存儲過程可以返回多個。而函數是可以嵌入在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 權限。

在函數中,區別處理導致刪除語句并且繼續在諸如觸發器或存儲過程等模式中的下一語句的 Transact-SQL 錯誤。在函數中,上述錯誤會導致停止執行函數。接下來該操作導致停止喚醒調用該函數的語句。

用戶定義函數的類型
SQL Server 2000 支持三種用戶定義函數:

標量函數

內嵌表值函數

多語句表值函數
用戶定義函數采用零個或更多的輸入參數并返回標量值或表。函數最多可以有 1024 個輸入參數。當函數的參數有默認值時,調用該函數時必須指定默認 DEFAULT 關鍵字才能獲取默認值。該行為不同于在存儲過程中含有默認值的參數,而在這些存儲過程中省略該函數也意味著省略默認值。用戶定義函數不支持輸出參數。

標量函數返回在 RETURNS 子句中定義的類型的單個數據值??梢允褂盟袠肆繑祿愋?,包括 bigint 和 sql_variant。不支持 timestamp 數據類型、用戶定義數據類型和非標量類型(如 table 或 cursor)。在 BEGIN...END 塊中定義的函數主體包含返回該值的 Transact-SQL 語句系列。返回類型可以是除 text、ntext、image、cursor 和 timestamp 之外的任何數據類型。

表值函數返回 table。對于內嵌表值函數,沒有函數主體;表是單個 SELECT 語句的結果集。對于多語句表值函數,在 BEGIN...END 塊中定義的函數主體包含 TRANSACT-SQL 語句,這些語句可生成行并將行插入將返回的表中。有關內嵌表值函數的更多信息,請參見內嵌用戶定義函數。有關表值函數的更多信息,請參見返回 table 數據類型的用戶定義函數。

BEGIN...END 塊中的語句不能有任何副作用。函數副作用是指對具有函數外作用域(例如數據庫表的修改)的資源狀態的任何永久性更改。函數中的語句唯一能做的更改是對函數上的局部對象(如局部游標或局部變量)的更改。不能在函數中執行的操作包括:對數據庫表的修改,對不在函數上的局部游標進行操作,發送電子郵件,嘗試修改目錄,以及生成返回至用戶的結果集。

函數中的有效語句類型包括:

DECLARE 語句,該語句可用于定義函數局部的數據變量和游標。

為函數局部對象賦值,如使用 SET 給標量和表局部變量賦值。

游標操作,該操作引用在函數中聲明、打開、關閉和釋放的局部游標。不允許使用 FETCH 語句將數據返回到客戶端。僅允許使用 FETCH 語句通過 INTO 子句給局部變量賦值。

控制流語句。

SELECT 語句,該語句包含帶有表達式的選擇列表,其中的表達式將值賦予函數的局部變量。

INSERT、UPDATE 和 DELETE 語句,這些語句修改函數的局部 table 變量。

EXECUTE 語句,該語句調用擴展存儲過程。
在查詢中指定的函數的實際執行次數在優化器生成的執行計劃間可能不同。示例為 WHERE 子句中的子查詢喚醒調用的函數。子查詢及其函數執行的次數會因優化器選擇的訪問路徑而異。

用戶定義函數中不允許使用會對每個調用返回不同數據的內置函數。用戶定義函數中不允許使用以下內置函數:

@@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 


架構綁定函數
CREATE FUNCTION 支持 SCHEMABINDING 子句,后者可將函數綁定到它引用的任何對象(如表、視圖和其它用戶定義函數)的架構。嘗試對架構綁定函數所引用的任何對象執行 ALTER 或 DROP 都將失敗。

必須滿足以下條件才能在 CREATE FUNCTION 中指定 SCHEMABINDING:

該函數所引用的所有視圖和用戶定義函數必須是綁定到架構的。

該函數所引用的所有對象必須與函數位于同一數據庫中。必須使用由一部分或兩部分構成的名稱來引用對象。

必須具有對該函數中引用的所有對象(表、視圖和用戶定義函數)的 REFERENCES 權限。
可使用 ALTER FUNCTION 刪除架構綁定。ALTER FUNCTION 語句將通過不帶 WITH SCHEMABINDING 指定函數來重新定義函數。

調用用戶定義函數
當調用標量用戶定義函數時,必須提供至少由兩部分組成的名稱:

SELECT *, MyUser.MyScalarFunction()FROM MyTable可以使用一個部分構成的名稱調用表值函數:

SELECT *FROM MyTableFunction()然而,當調用返回表的 SQL Server 內置函數時,必須將前綴 :: 添加至函數名:

SELECT * FROM ::fn_helpcollations()可在 Transact-SQL 語句中所允許的函數返回的相同數據類型表達式所在的任何位置引用標量函數,包括計算列和 CHECK 約束定義。例如,下面的語句創建一個返回 decimal 的簡單函數:

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然后可以在允許整型表達式的任何地方(如表的計算列中)使用該函數:

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 是返回標量值的用戶定義函數的一個示例。RETURNS 子句定義由該函數返回的值的標量數據類型。BEGIN...END 塊包含一個或多個執行該函數的 Transact-SQL 語句。該函數中的每個 RETURN 語句都必須具有一個參數,可返回具有在 RETURNS 子句中指定的數據類型(或可隱性轉換為 RETURNS 中指定類型的數據類型)的數據值。RETURN 參數的值是該函數返回的值


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
亚洲香蕉成人av网站在线观看_欧美精品成人91久久久久久久_久久久久久久久久久亚洲_热久久视久久精品18亚洲精品_国产精自产拍久久久久久_亚洲色图国产精品_91精品国产网站_中文字幕欧美日韩精品_国产精品久久久久久亚洲调教_国产精品久久一区_性夜试看影院91社区_97在线观看视频国产_68精品久久久久久欧美_欧美精品在线观看_国产精品一区二区久久精品_欧美老女人bb
这里只有视频精品| 久久精品夜夜夜夜夜久久| 国产91在线高潮白浆在线观看| 国产欧美一区二区三区在线| 亚洲伊人一本大道中文字幕| 国产精品极品尤物在线观看| 欧美性开放视频| 久久亚洲综合国产精品99麻豆精品福利| 亚洲精品乱码久久久久久金桔影视| 国产成人+综合亚洲+天堂| 26uuu另类亚洲欧美日本一| 久久亚洲精品视频| 乱亲女秽乱长久久久| 91黑丝在线观看| 国产精品久久久久久婷婷天堂| 日韩精品视频中文在线观看| 亚洲人成网站999久久久综合| 91精品国产高清久久久久久91| 日韩中文字幕视频在线| 91sao在线观看国产| 午夜欧美大片免费观看| 国产精品久久久久久av福利软件| 中文字幕日韩电影| 色婷婷综合久久久久| 久久国产一区二区三区| 欧美韩国理论所午夜片917电影| 亚洲精品国产精品自产a区红杏吧| 欧美国产日韩中文字幕在线| 亚洲国产女人aaa毛片在线| 国产精品美女呻吟| 亚洲精品福利在线| 欧美性猛交xxxx免费看漫画| 九九热这里只有精品6| 国产欧美日韩精品专区| 精品国产一区二区三区久久久| 日韩经典一区二区三区| 欧美日韩国产综合视频在线观看中文| 日本a级片电影一区二区| 91久久国产精品| 日韩在线播放视频| 亚洲欧美视频在线| 91色精品视频在线| 亚洲国产一区自拍| 中文字幕综合在线| 日韩免费在线观看视频| 欧美黑人一级爽快片淫片高清| 亚洲国产精品成人va在线观看| 国产91免费观看| 在线免费看av不卡| 亚洲欧美日韩一区二区三区在线| 成人动漫网站在线观看| 色噜噜狠狠狠综合曰曰曰| 亚洲肉体裸体xxxx137| 自拍亚洲一区欧美另类| 国产91精品久久久| 欧美最猛性xxxxx亚洲精品| 欧美尺度大的性做爰视频| 欧美激情aaaa| 国产在线观看精品| 国产精品www色诱视频| 日韩女优在线播放| 久久精品2019中文字幕| 国产香蕉97碰碰久久人人| 久久精品成人欧美大片古装| 国产主播喷水一区二区| 欧美日韩ab片| 亚洲午夜未满十八勿入免费观看全集| 欧美性黄网官网| 久久99国产综合精品女同| 国产精品成久久久久三级| 亚洲电影免费观看高清完整版| 国产香蕉一区二区三区在线视频| 国产亚洲欧美日韩一区二区| 国产精品www| 亚洲精品自在久久| 国产亚洲精品美女久久久久| 岛国av一区二区三区| 精品亚洲aⅴ在线观看| 久久99久久99精品中文字幕| 欧美成年人视频网站| 国产精品xxxxx| 国产在线播放91| 欧美—级高清免费播放| 精品国产欧美一区二区三区成人| 日韩精品极品毛片系列视频| 精品自在线视频| 久久夜色精品国产欧美乱| 欧美大片在线影院| 成人精品一区二区三区电影免费| 福利二区91精品bt7086| 欧美性xxxxx极品| 国产在线观看不卡| 欧美成人免费观看| 亚洲一级免费视频| 亚洲视频欧洲视频| 国产一区二区美女视频| 国产成人精品久久二区二区| 国产日韩精品综合网站| 日韩va亚洲va欧洲va国产| 欧美成人中文字幕| 欧美中文在线观看| 欧美第一淫aaasss性| 高清一区二区三区日本久| 欧美亚洲视频在线看网址| 久久精品美女视频网站| 亚洲91av视频| 法国裸体一区二区| 日韩精品视频在线播放| 最好看的2019年中文视频| 亚洲欧美自拍一区| 欧美国产日韩精品| 欧美孕妇孕交黑巨大网站| 18性欧美xxxⅹ性满足| 久久中文久久字幕| 亚洲黄色www| 亚洲男子天堂网| 亚洲精品一区久久久久久| 97久久伊人激情网| 在线看日韩av| 欧美成人性色生活仑片| 日韩精品免费在线观看| 欧美极品美女视频网站在线观看免费| 欧美大片在线看免费观看| 色综合视频网站| xxav国产精品美女主播| 日韩中文字幕免费看| 日韩免费在线免费观看| 在线性视频日韩欧美| 97视频人免费观看| 日本一欧美一欧美一亚洲视频| 日本精品一区二区三区在线播放视频| 欧美小视频在线观看| 色av中文字幕一区| 中文国产成人精品久久一| 日韩美女激情视频| 日韩av大片在线| 日韩大陆欧美高清视频区| 91精品国产91久久久久久吃药| 欧美乱人伦中文字幕在线| 18久久久久久| 秋霞av国产精品一区| 欧美一级视频一区二区| 奇米成人av国产一区二区三区| 久久理论片午夜琪琪电影网| 日韩中文在线中文网在线观看| 国产专区精品视频| 97久久伊人激情网| 亚洲精品久久久久久久久久久久| 欧美在线视频观看免费网站| 国产一级揄自揄精品视频| 8050国产精品久久久久久| 91po在线观看91精品国产性色| 国产热re99久久6国产精品| 国产精品自产拍高潮在线观看| 国产视频精品自拍| 欧美日韩视频免费播放| 国产精品视频网站| 亚洲日韩欧美视频一区| 国产成人久久久精品一区| 最近日韩中文字幕中文| 欧美亚洲国产视频| 3344国产精品免费看| 另类色图亚洲色图| 91精品在线观|