當前位置:首頁 » 存儲配置 » sql函數和存儲過程

sql函數和存儲過程

發布時間: 2022-05-17 12:45:45

sql用戶自定義函數和存儲過程有什麼區別

本質上沒區別。只是函數有如:只能返回一個變數的限制。而存儲過程可以返回多個。而函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程不行。執行的本質都一樣。

Ⅱ sql函數和過程的正確描述是什麼

區別如下:

  1. 存儲過程可以返回多個變數,函數只能返回一個,函數是可以嵌入在sql語句中使用的,而存儲過程不可以。

  2. 對於函數來書可以返回值或者表對象,而存儲過程來說可以返回參數。

  3. 函數可以通過return 語句返回函數值,而存儲過程不能。

  4. 當存儲過程和函數被執行的時候,SQL Manager會到procere cache中去取相應的查詢語句,如果在procere cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯

sql示例:

  1. 創建函數、查找函數:

(2)sql函數和存儲過程擴展閱讀

存儲過程在大型資料庫系統中,一組為了完成特定功能的SQL 語句集,它存儲在資料庫中,一次編譯後永久有效,用戶通過指定存儲過程的名字並給出參數(如果該存儲過程帶有參數)來執行它。存儲過程是資料庫中的一個重要對象。

在 SQL 中,基本的函數類型和種類有若干種。函數的基本類型是: Aggregate 函數 Scalar 函數

Ⅲ SQL SERVER 中存儲過程和函數的區別

一、多數指令是相同的,包括創建和修正存儲過程的指令。二、很多細微的指令有不同,具體如下(不僅):1mysql支持enum,和set類型,sqlserver不支持2mysql不支持nchar,nvarchar,ntext類型3mysql的遞增語句是AUTO_INCREMENT,而mssql是identity(1,1)MYSQL:createtablebasic(idintkeyauto_increment,namevarchar(20));MSSQL:createtablebasic(idintidentity(1,1),namevarchar(20))4msms默認到處表創建語句的默認值表示是((0)),而在mysql裡面是不允許帶兩括弧的5mysql需要為表指定存儲類型6mssql識別符是[],[type]表示他區別於關鍵字(可選用來包含表名、欄位名),但是mysql卻是`(重音符,也就是按鍵1左邊的那個符號)7mssql支持getdate()方法獲取當前時間日期,但是mysql裡面可以分日期類型和時間類型,獲取當前日期是cur_date(),當前完整時間是now()函數8mssql不支持replaceinto語句,但是在最新的sql20008裡面,也支持merge語法9mysql支持insertintotable1sett1=『』,t2=『』,但是mssql不支持這樣寫10mysql插入多行支持這樣寫insertintotabl1values(1,1),(1,1),(1,1),(1,1),(1,1),(1,1),(1,1)MSSQL不支持11mssql不支持limit語句,是非常遺憾的,只能用top取代limt0,N,row_number()over()函數取代limitN,M12mysql在創建表時要為每個表指定一個存儲引擎類型,而mssql只支持一種存儲引擎13mysql不支持默認值為當前時間的datetime類型(mssql很容易做到),在mysql裡面是用timestamp類型14mssql裡面檢查是否有這個表再刪除,需要這樣:ifexists(select*fromdbo.sysobjectswhereid=object_id(N'uc_newpm')andOBJECTPROPERTY(id,N'IsUserTable')=1)但是在mysql裡面只需要DROPTABLEIFEXISTScdb_forums;15mysql支持無符號型的整數,那麼比不支持無符號型的mssql就能多出一倍的最大數存儲16mysql不支持在mssql裡面使用非常方便的varchar(max)類型,這個類型在mssql裡面既可做一般數據存儲,也可以做blob數據存儲17mysql創建非聚集索引只需要在創建表的時候指定為key就行,比如:KEYdisplayorder(fid,displayorder)在mssql裡面必須要:_uc_protectedmembers_username_appidondbo.uc_protectedmembers(usernameasc,appidasc)18mysqltext欄位類型不允許有默認值19mysql的一個表的總共欄位長度不超過65XXX。20一個很表面的區別就是mysql的安裝特別簡單,而且文件大小才110M(非安裝版),相比微軟這個龐然大物,安裝進度來說簡直就是..21mysql的管理工具有幾個比較好的,mysql_front,和官方那個套件,不過都沒有SSMS的使用方便,這是mysql很大的一個缺點。22mysql的存儲過程只是出現在最新的版本中,穩定性和性能可能不如mssql。23同樣的負載壓力,mysql要消耗更少的CPU和內存,mssql的確是很耗資源。24php連接mysql和mssql的方式都差不多,只需要將函數的mysql替換成mssql即可。25mysql支持date,time,year類型,mssql到2008才支持date和time。26變數賦值MYsql:變數賦值SELECT@min_price:=MIN(price),@max_price:=MAX(price)FROMshopMSsql:變數賦值SELECT@min_price=MIN(price),@max_price=MAX(price)FROMshop三、總的來說,如果是簡單的存儲過程代碼,要修改,不會太難。如果是復雜的系統,要移植會很難很難。

Ⅳ 存儲過程跟SQL語句比較,各有什麼優點和缺點

SQL存儲過程放在SQL資料庫中,1,因此在程序中調用的時候不必自己拼接sql語句。2,SQLSERVER會對存儲過程進行預編譯,因此速度快。3,在網路上不必傳輸冗長的SQL語句,而是直接調用存儲過程的名字,因此可以加快速度當然,在一些外包軟體開發中,是不允許使用存儲過程的。因為對方不可以把資料庫暴露給你,此時你只能使用SQL語句。不過國內的一些小型企業使用SQL存儲過程還是很流行的。因為程序代碼里不包含SQL語句,因此會資料庫會相對安全一些。

Ⅳ SQL的函數和過程正確的描述是

SQL允許定義函數、過程和方法。定義可通過SQL的有關過程的組件,也可以通過外部的程序設計語言,如Java,C或C++。SQL標准所定義的語法,與大多數資料庫實現的自身的非標准版本的語法不同。函數和過程允許「業務邏輯」作為存儲過程記錄在資料庫中,並在資料庫中執行。

業務邏輯能夠被寫成程序設計語言過程並完全存儲在資料庫之外,但把它們定義成資料庫中的存儲過程有幾個優點:

1 允許多個應用訪問這些過程。

2.允許當業務規則發生改變時進行單個點的改變,而不變改變應用系統的其他部分。

3.應用代碼可以調用存儲過程,而不是直接更新資料庫關系。

具體操作如下:

1. 聲明方式。

在begin……end之間的語句可以執行signal out_of_classrome_seats來引發異常。這個句柄說明如果條件發生,將會採取動作終止begin end中的語句。另一個可選的動作是continue,它繼續從引發異常的語句的下一條語句開始執行。

    Ⅵ 存儲過程和函數的區別

    一、含義不同

    1、存儲過程:存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲並作為一個單元處理。

    2、函數:是由一個或多個 SQL 語句組成的子程序,可用於封裝代碼以便重新使用。函數限制比較多,如不能用臨時表,只能用表變數等

    二、使用條件不同

    1、存儲過程:可以在單個存儲過程中執行一系列 SQL 語句。而且可以從自己的存儲過程內引用其它存儲過程,這可以簡化一系列復雜語句。

    2、函數:自定義函數諸多限制,有許多語句不能使用,許多功能不能實現。函數可以直接引用返回值,用表變數返回記錄集。但是,用戶定義函數不能用於執行一組修改全局資料庫狀態的操作。

    三、執行方式不同

    1、存儲過程:存儲過程可以返回參數,如記錄集,函數只能返回值或者表對象。存儲過程的參數有in,out,inout三種,存儲過程聲明時不需要返回類型。

    2、函數:函數參數只有in,而函數需要描述返回類型,且函數中必須包含一個有效的return語句。

    Ⅶ SQL中的函數和存儲過程有啥區別

    本質上沒區別。只是函數有如:只能返回一個變數的限制。而存儲過程可以返回多個。而函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程不行。執行的本質都一樣。

    函數限制比較多,比如不能用臨時表,只能用表變數.還有一些函數都不可用等等.而存儲過程的限制相對就比較少

    1. 一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。

    2. 對於存儲過程來說可以返回參數,而函數只能返回值或者表對象。

    3. 存儲過程一般是作為一個獨立的部分來執行,而函數可以作為查詢語句的一個部分來調用,由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。

    4. 當存儲過程和函數被執行的時候,SQL Manager會到procere cache中去取相應的查詢語句,如果在procere cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。

    Procere cache中保存的是執行計劃 (execution plan) ,當編譯好之後就執行procere 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 參數的值是該函數返回的值

    Ⅷ SQL函數和存儲過程的區別

    不同點:
    1、標識符不同。函數的標識符為FUNCTION,過程為:PROCEDURE。
    2、函數中有返回值,且必須返回,而過程可以沒有返回值。
    3、過程無返回值類型,不能將結果直接賦值給變數;函數有返回值類型,調用時,除在select中,必須將返回值賦給變數。
    4、函數可以在select語句中直接使用實現對欄位進行計算,而存儲過程不能,
    例如:假設已有函數fun_getAVG() 返回number類型絕對值。
    那麼select fun_getAVG(col_a) from table 這樣是可以的。
    5、函數一般處理簡單的邏輯方便,存儲過程一般處理復雜的邏輯,

    相同點:
    1、二者都可以有輸出
    2、二者寫法邏輯上很相似

    Ⅸ SQL中存儲過程和函數的區別

    本質上沒區別。只是函數有如:只能返回一個變數的限制。而存儲過程可以返回多個。而函數是可以嵌入在sql中使用的,可以在select中調用,而存儲過程不行。執行的本質都一樣。
    函數限制比較多,比如不能用臨時表,只能用表變數.還有一些函數都不可用等等.而存儲過程的限制相對就比較少
    1. 一般來說,存儲過程實現的功能要復雜一點,而函數的實現的功能針對性比較強。
    2. 對於存儲過程來說可以返回參數,而函數只能返回值或者表對象。
    3. 存儲過程一般是作為一個獨立的部分來執行(EXEC執行),而函數可以作為查詢語句的一個部分來調用(SELECT調用),由於函數可以返回一個表對象,因此它可以在查詢語句中位於FROM關鍵字的後面。
    4. 當存儲過程和函數被執行的時候,SQL Manager會到procere cache中去取相應的查詢語句,如果在procere cache里沒有相應的查詢語句,SQL Manager就會對存儲過程和函數進行編譯。
    Procere cache中保存的是執行計劃 (execution plan) ,當編譯好之後就執行procere cache中的execution plan,之後SQL SERVER會根據每個execution plan的實際情況來考慮是否要在cache中保存這個plan,評判的標准一個是這個execution plan可能被使用的頻率;其次是生成這個plan的代價,也就是編譯的耗時。保存在cache中的plan在下次執行時就不用再編譯了。

    Ⅹ SQL Server 的函數與存儲過程

    1.
    函數結構:架構+函數名稱
    2.
    所以一般在存儲過程都可以直接調用,如下sql:
    3.
    假如函數test,參數為字元串類型
    4.
    select
    dbo.test('123')
    5.
    存儲過程調用也是以上格式一樣,

    熱點內容
    vb軟體加密 發布:2024-11-15 21:17:23 瀏覽:595
    本地ip可以搭伺服器嗎 發布:2024-11-15 21:04:27 瀏覽:162
    阿里巴巴python 發布:2024-11-15 20:56:25 瀏覽:782
    博圖腳本編輯 發布:2024-11-15 20:41:06 瀏覽:312
    帶密碼的箱子鑰匙在哪裡 發布:2024-11-15 20:40:12 瀏覽:236
    兩個次梁相交怎麼配置 發布:2024-11-15 20:27:35 瀏覽:373
    android關機實現 發布:2024-11-15 20:26:42 瀏覽:56
    木糠壓縮原理 發布:2024-11-15 20:22:53 瀏覽:654
    編譯原理難以理解的問題 發布:2024-11-15 20:11:25 瀏覽:130
    安卓9是什麼水平 發布:2024-11-15 20:06:57 瀏覽:185