SQL 2000用戶自定義函數

一。SQL Server 的三種自定義函數

“自定義函數”是我們平常的說法,而“用戶定義的函數”是 SQL Server 中書面的說法。

SQL Server 2000 允許用戶創建自定義函數,自定義函數可以有返回值。

自定義函數分爲:標量值函數或表值函數

  • 如果 RETURNS 子句指定一種標量數據類型,則函數爲標量值函數。可以使用多條 Transact-SQL 語句定義標量值函數。
  • 如果 RETURNS 子句指定 TABLE,則函數爲表值函數。

表值函數又可分爲:內嵌表值函數(行內函數)或多語句函數

  • 如果 RETURNS 子句指定的 TABLE 不附帶列的列表,則該函數爲內嵌表值函數。
  • 如果 RETURNS 子句指定的 TABLE 類型帶有列及其數據類型,則該函數是多語句表值函數。

標量值函數示例

CREATE FUNCTION dbo.Foo()
RETURNS int
AS 
BEGIN
    declare @n int
    select @n=3
    return @n
END

create function GetSex(@sex int)
returns varchar(2)-- 用nvarchar(1)
as                    --  nvarchar:不管是一個字符還是一個漢字,都存爲2個字節
begin                 -- varchar:漢字是2個字節,其他字符存爲1個字節
declare @ssex varchar(2)-- 用nvarchar(1)
 if(@sex=1)
    set @ssex='男'
  else
    set @ssex='女'
return (@ssex)
end
調用:
select id,username,dbo.GetSex(Sex) as sex ,loginnum from t_user

內嵌表值函數示例

CREATE FUNCTION dbo.Foo()
RETURNS TABLE
AS 
    return select id, title from msgs

內嵌表值函數只有一個 select 語句。

多語句表值函數示例(部分)

CREATE FUNCTION FindUsers (@userid int )
RETURNS @FindUser TABLE (id int primary key, UserName varchar(30), RegDateTime DateTime,LoginNum int)
as
begin
insert into @FindUser Select ID, UserName,RegDateTime,LoginNum From T_User Where ID=@userid
return
end 

調用:
SELECT * FROM FindUsers(6)

注意其 RETURNS 部分。

多語句函數的主體中允許使用以下語句。未在下面的列表中列出的語句不能用在函數主體中。

  • 賦值語句。
  • 控制流語句。
  • DECLARE 語句,該語句定義函數局部的數據變量和遊標。
  • SELECT 語句,該語句包含帶有表達式的選擇列表,其中的表達式將值賦予函數的局部變量。
  • 遊標操作,該操作引用在函數中聲明、打開、關閉和釋放的局部遊標。只允許使用以 INTO 子句向局部變量賦值的 FETCH 語句;不允許使用將數據返回到客戶端的 FETCH 語句。
  • INSERT、UPDATE 和 DELETE 語句,這些語句修改函數的局部 table 變量。
  • EXECUTE 語句調用擴展存儲過程。

二.如何調用自定義函數

 

調用自定義函數(用戶定義的函數)和調用內置函數方式基本相同,

  • 當調用標量值函數時,必須加上“所有者”,通常是 dbo(但不是絕對,可以在企業管理器中的“用戶定義的函數”中查看所有者)。
  • 當調用表值函數時,可以只使用函數名稱。

示例

SELECT *
select dbo.Sta(cnt) from tbl

示例

SELECT *
FROM fn_MyTableFunc( 123.09, N'O''Neill' )
三。存儲過程和自定義函數的區別

存儲過程(用戶定義的存儲過程)和自定義函數(用戶定義的函數)的區別,在網上已經有討論過,但有些顯得過於零散,有些又篇幅過長不能保證每個人都細心閱讀。這裏作一個歸納,當然只是應用層面的,可能不全面。

  • 存儲過程,功能強大,可以執行包括修改表等一系列數據庫操作,也可以創建爲 SQL Server 啓動時自動運行的存儲過程。
  • 自定義函數,用戶定義函數不能用於執行一組修改全局數據庫狀態的操作。

 

  • 存儲過程,可以使用非確定函數。
  • 自定義函數,不允許在用戶定義函數主體中內置非確定函數

 

  • 存儲過程,可返回記錄集。
  • 自定義函數,可以返回表變量。

 

  • 存儲過程,其返回值不能被直接引用。
  • 自定義函數,其返回值可以被直接引用。

 

  • 存儲過程,用 EXECUTE 語句執行。
  • 自定義函數,在查詢語句中調用
發佈了32 篇原創文章 · 獲贊 5 · 訪問量 3萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章