/*****************************************************
*** author:Susan
***date:
*** expliation:如何寫函數的格式及例子,有游標的用法!
*** 本版是SQL SERVER 版!
******************************************************/
在sql函數的格式規格:
CREATE FUNCTION XXX(參數1,參數2,……)
※RETURNS 返回值的類型
/*
列舉傳入參數
1:名稱,2:類型,包括長度
Eg:@strUNIT_CODE varCHAR(3)
返回值的類型 à類型,包括長度
Eg: varCHAR(8000)
*/
As
/*
定義內部參數
1:名稱,2:類型,包括長度
Eg:@strUNIT_CODE varCHAR(3)
*/
※ BEGIN
Declare
參數1,
參數2……………
/*
初始化內部參數
Eg:SET @strUNIT_CODE=’’
*/
Set參數1的初始值
Set參數2的初始值…………
/*
過程的主內容區
Trascation:這裡起到的作用是,如果他中間的任何一個執行錯誤,就全部執行都返回,這裡sql sever 7.0以前一定要寫入,以後的就可以省略
Return:結束這支fn
*/
/*
1:可以取得需要的值以存在內部參數中
Eg:SELECT @strUNIT_CODE=UNIT_CODE FROM UNIT WHERE …….
2:可以用取到的或傳入的參數進行判斷,來進行各種選取的操作,但不可以進行update,insert,delete等等的操作!
eg: IF @strUNIT_CODE=’’
BEGIN
//具體的操作
End
Else
Begin
//具體的操作
End
3:有關游標的問題
Eg:
declare db cursor for //聲明一個游標(db為其名稱)
SELECT UNIT_NAME FROM UNIT WHERE LEFT(UNIT_CODE,2)=LEFT(@strTO,2)//記錄集
open db //打開游標
fetch next from db into @strUNIT_NAME //將第一個值放入一個參數中
while @@fetch_status = 0 ---存在本筆值向下循環(0:順利執行;-1:失敗,或資料列超出結果集;-2:擷取的資料列已遺漏)
BEGIN ----開始循環
//個體操作
End ----結束循環
Close db ---關閉游標
deallocate db //移除資料指標參考
*/
※ Return 回傳值
※ End
下面是一個例子
CREATE FUNCTION TEST_3_Fn(@strTO VARCHAR(4))
/*
作者:Susan
時間:
程式功能:
參數: 機關代碼
輸出:機關名稱
調用方法:SELECT TEST_3_Fn('011')
結果:機關名稱串起來
*/
RETURNS VARCHAR(8000)
as
BEGIN
DECLARE
@strUNIT_NAME VARCHAR(800),
@strSQL VARCHAR(8000),
@Link VARCHAR(1),
@Link1 VARCHAR(1)
SET @strUNIT_NAME=''
SET @strSQL=''
SET @Link=''
SET @Link1=''
/*
處理update 的部分
在函數中不可以進行insert,update ,delete的動作!
功能說明:本fn用於處理cursor問題
*/
IF @strTO<>''
BEGIN
declare db cursor for --必需聲明在查詢的前面
SELECT UNIT_NAME FROM UNIT WHERE LEFT(UNIT_CODE,2)=LEFT(@strTO,2)---取到相關信息
END
ELSE
BEGIN
declare db cursor for --必需聲明在查詢的前面
SELECT UNIT_NAME FROM UNIT WHERE LEFT(UNIT_CODE,2)=LEFT('011',2)---取到相關信息
END
open db ---開起取到的信息
fetch next from db into @strUNIT_NAME ---把第一筆放入@strUNIT_NAME中
while @@fetch_status = 0 ---表示存在本筆資料
BEGIN ----開始循環
set @strSQL =@strSQL+@Link1+@Link+ @strUNIT_NAME ----設定保存的值
fetch next from db into @strUNIT_NAME ----進行下次循環
SET @Link=CHAR(13) +CHAR(10)
SET @Link1=','
END ----結束循環
close db ---關閉信息
deallocate db
RETURN @strSQL
END