sql server使用者自定義函式

2022-06-09 02:18:10 字數 3252 閱讀 9201

1. 返回標量資料的函式

使用者定義函式接受零個或更多的輸入引數,並返回單值。一些使用者定義函式返回單個的標量資料值,如 int、char 或 decimal 值。

例如,下面的語句建立乙個返回 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注意:和儲存過程有三個地方不同:

1.引數必須寫在括號裡面

2.引數後面有一條return語句, 表示返回值的型別

3.函式體內需要有return,返回結果。

2. 如何呼叫函式

dbo.functionname(parameter1,...)

然後可以在允許整型表示式的任何地方(如表的計算列中)使用該函式:

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

這裡的計算列還是第一次看到, 原來以為這個是更高階別的dataset裡面的東西。

3. 返回表變數的函式

在返回 table 的使用者定義函式中:

returns 子句為函式返回的表定義區域性返回變數名。returns 子句還定義表的格式。區域性返回變數名的作用域位於函式內。

函式主體中的 transact-sql 語句生成行並將其插入 returns 子句所定義的返回變數。

當執行 return 語句時,插入變數的行以函式的**格式輸出形式返回。return 語句不能有引數。

函式中返回 table 的 transact-sql 語句不能直接將結果集返回使用者。函式返回使用者的唯一資訊是由該函式返回的 table。

下例在 northwind 資料庫中建立乙個返回 table 的函式:

create function largeordershippers ( @freightparm money )

returns @ordershippertab table

(shipperid     int,

shippername   nvarchar(80),

orderid       int,

shippeddate   datetime,

freight       money)as

begin

insert @ordershippertab

select s.shipperid, s.companyname,

o.orderid, o.shippeddate, o.freight

from shippers as s inner join orders as o

on s.shipperid = o.shipvia

where o.freight > @freightparm

return

end在這個函式中,返回的本地變數名是 @ordershippertab。函式主體中的語句將行插入變數 @ordershippertab,以生成該函式返回的表結果。

下面的查詢在其 from 子句中引用函式返回的表:

select *

from largeordershippers( $500 )

注意函式內不能使用臨時表, 但可以使用表變數

函式頭部return子句也是定義要返回的表變數, 但格式比較特殊。

在函式體內定義表變數的一般格式為:

declare @tablevar table(

colname type,

。。。)

臨時表和表變數的區別:

臨時表分為本地和全域性兩種,本地臨時表的名稱都是以「#」為字首,只有在本地當前的使用者連線中才是可見的,當使用者從例項斷開連線時被刪除。全域性臨時表的名稱都是以「##」為字首,建立後對任何使用者都是可見的,當所有引用該錶的使用者斷開連線時被刪除。

表變數建立的語法類似於臨時表,區別就在於建立的時候,必須要為之命名。表變數是變數的一種,表變數也分為本地及全域性的兩種,本地表變數的名稱都是以「@」為字首,只有在本地當前的使用者連線中才可以訪問。全域性的表變數的名稱都是以「@@」為字首,一般都是系統的全域性變數,像我們常用到的,如 @@error代表錯誤的號,@@rowcount代表影響的行數。

比較臨時表及表變數都可以通過sql的選擇、插入、更新及刪除語句,它們的的不同主要體現在以下這些:

1)表變數是儲存在記憶體中的,當使用者在訪問表變數的時候,sql server是不產生日誌的,而在臨時表中是產生日誌的;

2)在表變數中,是不允許有非聚集索引的;

3)表變數是不允許有default預設值,也不允許有約束;

4)臨時表上的統計資訊是健全而可靠的,但是表變數上的統計資訊是不可靠的;

5)臨時表中是有鎖的機制,而表變數中就沒有鎖的機制。

對於函式中不能支援臨時表是由於函式不能對函式作用域外部的資源狀態造成永久性的更改,在sqlserver中也稱為*** (sideeffect)。不過如果在函式中使用大型的臨時結果集是不推薦的,因為如果將這樣的函式放置到乙個查詢中會造成很明顯的效能問題,因此這種情況一般都採用儲存過程之類的批處理指令碼。

對於動態指令碼不支援表變數的原因是因為儲存過程不接受表型別的引數。不過如果表變數的宣告和賦值都在sp_executesql的引數中的話, sp_executesql就可以執行了,因為這個時候表變數就存在sp_executesql的stmt引數裡面,不需要傳入,例如下面的**:(當然這樣的實用性也就沒有多少了)

declare @m nvarchar(max)

set @m = n"declare @t table (id int);insert into @tvalues(1);select * from @t t"

exec sp_executesql @m

SQL Server 使用者自定義函式

除了使用系統提供的函式外,使用者還可以根據需要自定義函式。使用者自定義函式是 sql server 2000 新增的資料庫物件,是 sql server 的一大改進。與程式語言中的函式類似,microsoft sql server 使用者定義函式是接受引數 執行操作 例如複雜計算 並將操作結果以值的...

SQL Server 使用者自定義函式

除了使用系統提供的函式外,使用者還可以根據需要自定義函式。使用者自定義函式是 sql server 2000 新增的資料庫物件,是 sql server 的一大改進。與程式語言中的函式類似,microsoft sql server 使用者定義函式是接受引數 執行操作 例如複雜計算 並將操作結果以值的...

SQL Server 使用者自定義函式

除了使用系統提供的函式外,使用者還可以根據需要自定義函式。使用者自定義函式是 sql server 2000 新增的資料庫物件,是 sql server 的一大改進。與程式語言中的函式類似,microsoft sql server 使用者定義函式是接受引數 執行操作 例如複雜計算 並將操作結果以值的...