SQLServer 2000中,存儲過程和用戶自定義函數具體的區別??

存儲過程

存儲過程可使得對數據庫的管理、以及顯示關於數據庫及其用戶信息的工做容易得多。存儲過程是 SQL 語句和可選控制流語句的預編譯集合,以一個名稱存儲並做爲一個單元處理。存儲過程存儲在數據庫內,可由應用程序經過一個調用執行,並且容許用戶聲明變量、有條件執行以及其它強大的編程功能。 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 支持三種用戶定義函數: spa

  • 標量函數 

  • 內嵌表值函數 

  • 多語句表值函數

用戶定義函數採用零個或更多的輸入參數並返回標量值或表。函數最多能夠有 1024 個輸入參數。當函數的參數有默認值時,調用該函數時必須指定默認 DEFAULT 關鍵字才能獲取默認值。該行爲不一樣於在存儲過程當中含有默認值的參數,而在這些存儲過程當中省略該函數也意味着省略默認值。用戶定義函數不支持輸出參數。 .net

標量函數返回在 RETURNS 子句中定義的類型的單個數據值。可使用全部標量數據類型,包括 bigint 和 sql_variant。不支持 timestamp 數據類型、用戶定義數據類型和非標量類型(如 table 或 cursor)。在 BEGIN...END 塊中定義的函數主體包含返回該值的 Transact-SQL 語句系列。返回類型能夠是除 textntextimagecursor 和 timestamp 以外的任何數據類型。 code

表值函數返回 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.
AS
BEGIN
   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 參數的值是該函數返回的值。 

相關文章
相關標籤/搜索