UDF在層次型資料處理中的妙用之四

2021-04-17 04:19:56 字數 1713 閱讀 6729

四、查詢管理鏈

至此為止,前面的所有例子都是用只返回乙個值的數值型使用者定義函式(udf)。現在,我們來看看如何使用返回表的udf。這類函式的返回值是乙個記錄集或表(即,可用於from子句)。例如,在處理層次結構的資料時,乙個常見的需求是返回從指定管理員開始的整棵子樹。

listing6:獲得整棵子樹

createfunctionufn_getsubtree

(@mgridasint

)returns@treetable

(empidintnotnull,

mgridintnull,

empnamevarchar(25)notnull,

salarymoneynotnull,

lvlintnotnull,

pathvarchar(900)notnull)as

begin

declare@lvlasint,@pathasvarchar(900)

select@lvl=0,@path='.'

insertinto@tree

selectempid,mgrid,empname,salary,

@lvl,'.'+cast(empidasvarchar(10))+'.'

fromemployees

whereempid=@mgrid

while@@rowcount>0

begin

set@lvl=@lvl+1

insertinto@tree

selecte.empid,e.mgrid,e.empname,e.salary,

@lvl,t.path+cast(e.empidasvarchar(10))+'.'

fromemployeesasejoin@treeast

one.mgrid=t.empidandt.lvl=@lvl-1

endreturn

endlisting6顯示了建立ufn_getsubtree函式的指令碼。注意返回的表與原來的employees表有著相同的結構,但增加了兩個列:lvl和path。lvl列儲存子樹中從0開始計算的層次值,path列儲存「.id0.id1...idn」格式的雇員管理路徑。這個字串包含從子樹中最頂層的雇員開始、到當前的雇員為止的所有雇員id。路徑中所有雇員id的前面和後面都是句點符號。

path列允許對本例中dbo.ufn_getsubtree函式返回的子樹的行進行適當的排序。對於特定的雇員來說,由於其所有下屬的path值都以他的管理員的path值為字首,排序中這些值能夠正確地出現在它們的管理員之後。函式先把屬於管理員的行插入@tree表變數(屬於管理員的行在函式引數中指定)。接下來,函式開始乙個迴圈,只要前一次插入操作有結果,迭代就一直進行。迴圈中的**把前一次插入操作的直接下屬追加到@tree表變數。上次插入的雇員的級別可以通過在@lvl變數中跟蹤雇員在子樹中的當前級別得到。綠色chinaipower.comcxdie

現在我們可以測試一下ufn_getsubtree函式。要得到andrew(empid是2)以及他的所有下屬(包括各個級別)的詳細資訊,查詢命令如下:

select*fromufn_getsubtree(2)

orderbypath

要得到employees表中所有雇員的層次圖,查詢命令如下:

selectreplicate('|',lvl)+empnameasemployee

fromufn_getsubtree(1)

orderbypath

圖一顯示了上述查詢命令的結果。

FMDB中的資料處理

1 self.db executeupdate create table test a text,b text,c integer,d double,e double 我們建立乙個 text,可以很清楚的看到其欄位對應的資料型別 資料型別 text 字串型別。integer 整型。real 浮點型 ...

SQL Server樹型結構資料處理的儲存過程

我們在平常的系統開發中常常會遇到像無限級分類這樣的樹型結構資料,現提供乙個可用的資料庫儲存過程,可以完成樹型結構資料的排序。環境 windows7 sql server 2008 說明 下面 已經轉換成sql server2000的指令碼,處理效果如下,看sortname欄位結果,經過測試。建立樹型...

R語言 資料處理 R做資料處理中的小技巧

一 主要內容 建立新變數 修改資料 修改變數名 處理缺失值 資料排序 資料合併 資料篩選 抽樣二 r語言 rm list ls gc manager c 1,2,3,4,5 date c 10 24 08 10 28 08 10 1 08 10 12 08 5 1 09 country c us u...