本文將介紹Microsoft SQL Server 2000的新增特性―用戶自定義函數User-Defined Function(UDF),並演示幾個常用的實例。
UDF的功能類似SQL Server中內建的系統函數,如CONVERT、SUBSTRING、 DATAADD、 GETDATA、ISNULL等等。一個UDF可以沒有參數,或者帶有一個或多個參數,函數運行後將會返回一個函數值。定義UDF的語法如下:
CREATE FUNCTION [ owner_name.] function_name
( { { @parameter_name scalar_parameter_data_type
[,…n] ] )
RETURN scalar_return_data_type
[WITH < function_option> [, … n]]
[AS]
BEGIN
Function_body
RETURN scalar_expression
END
每個UDF可以帶有0個到1024個參數,每個參數可以是除了timestamp、cursor、table 以外所有的數據類型;函數返回值的限制要更多一些,它不可以是text、ntext、image、timestamp、cursor和table。
函數體是UDF的主要部分,它有兩個選項: ENCRYOTION和 SCHEMABINDING。
SCHEMABINDING是SQL Server 2000的新增功能,可以和視圖一同使用。該選項不允許刪除和修改被該函數引用的對象。這樣可以防止無效的函數和視圖對它們引用的對象進行結構上的修改。
大家會注意到函數體以Begin開始,End結束。這一點不同於創建存儲過程、觸發器和視圖。當您忘了寫上Begin/End時,系統會返回一個提示信息“Incorrect syntax near ‘RETURN’”。為什麼不直接說少了Begin/End,這有點讓人費解。
下面我用幾個例子來說明UDF的應用。
Greatest and Least
為了區別於系統函數Max和Min,我給新函數命名為Greatest和Least,它們會從以參數形式輸入的兩個值中找出最大值和最小值。
Case語句是兩個函數的核心:
CASE WHEN value1 > value2 THEN value1 ELSE value2 END
雖然函數很簡單,但用途是很廣的。
CREATE FUNCTION dbo.Greatest
-- Return the maximum of two parameters
(@Val1 SQL_VARIANT,
@Val2 SQL_VARIANT)
RETURNS SQL_VARIANT
AS
BEGIN
RETURN (CASE WHEN @val1 > @val2 THEN @val1 ELSE @val2 END)
END
go
CREATE FUNCTION dbo.Least
-- Return the minimum of two parameters
( @val1 SQL_VARIANT,
@val2 SQL_VARIANT )
RETURNS SQL_VARIANT
AS
BEGIN
RETURN (CASE WHEN @val1 < @val2 THEN @val1 ELSE @val2 END)
END
Go