SQL Server層次結(jié)構(gòu)的展開模式
以下的文章主要向大家講述的是SQL Server層次結(jié)構(gòu)的展開模式,在實(shí)際操作中如果數(shù)據(jù)庫經(jīng)常存儲(chǔ)層次信息的話。如下所示,以下的數(shù)據(jù)是全球一些地區(qū)的層次表示形式。這種表示形式并未清楚地顯示出數(shù)據(jù)中隱含的結(jié)構(gòu)。
- Parent Child -------------- -----------------
- World Europe World North America Europe France France Paris
- North America United States North America Canada United States New
- York United States Washington New York New York City Washington Redmond
而下面的示例則更容易解釋:
- World North America Canada United States Washington Redmond New York New York City Europe France Paris
下面的 Transact-SQL 過程將一個(gè)編碼的層次展開到任意深度。盡管 Transact-SQL 支持遞歸,但是使用臨時(shí)表作為堆棧來跟蹤所有正在處理中的項(xiàng)目(已經(jīng)開始但尚未結(jié)束),將更加有效。某個(gè)項(xiàng)目一旦處理完畢,將被從堆棧中刪除。當(dāng)發(fā)現(xiàn)新的項(xiàng)目時(shí),這些項(xiàng)目將被添加到堆棧中。
- CREATE PROCEDURE expand (@current char(20)) as SET NOCOUNT>
輸入?yún)?shù) (@current) 表示層次中的開始位置。它還跟蹤主循環(huán)中的當(dāng)前項(xiàng)目。
使用的兩個(gè)局部變量分別是 @level(用于跟蹤SQL Server層次結(jié)構(gòu)中的當(dāng)前級(jí)別)和 @line(是用于構(gòu)造縮進(jìn)行的工作區(qū))。
- SET NOCOUNT>
使用層次中開始點(diǎn)的項(xiàng)目標(biāo)識(shí)符來創(chuàng)建和整理臨時(shí)表 #stack,而 @level 被設(shè)置為與之匹配。#stack 中的 level 列允許同一個(gè)項(xiàng)目出現(xiàn)在數(shù)據(jù)庫的多個(gè)級(jí)別中。雖然這種情況不適用于該示例中的地理數(shù)據(jù),但是它可以用于其它示例。
在下面的示例中,當(dāng) @level 大于 0 時(shí),該過程執(zhí)行以下步驟:
1.如果當(dāng)前級(jí)別 (@level) 的堆棧中有任何項(xiàng)目,該過程將選擇其中一個(gè),并稱之為 @current。
2.縮進(jìn)項(xiàng)目 @level 空格,然后打印該項(xiàng)目。
3.從堆棧中刪除該項(xiàng)目以免重復(fù)處理它,然后將其所有子項(xiàng)目添加到堆棧的下一級(jí) (@level + 1) 中。這是唯一使用層次表 (#stack) 的地方。
如果使用傳統(tǒng)的編程語言,就必須找到每個(gè)子項(xiàng)目并將其逐個(gè)添加到堆棧中。而使用 Transact-SQL,只用一個(gè)語句就能找到并添加所有的子項(xiàng)目,以免又使用一個(gè)嵌套循環(huán)。
4.如果有子項(xiàng)目 (IF @@ROWCOUNT > 0),則下降一級(jí)處理它們 (@level= @level + 1);否則,繼續(xù)在當(dāng)前級(jí)別上處理。
5.***,如果在當(dāng)前級(jí)別的堆棧中沒有待處理的項(xiàng)目,則返回到上一級(jí),看上一級(jí)是否有待處理的項(xiàng)目 (@level= @level - 1)。當(dāng)再?zèng)]有上一級(jí)時(shí),則展開完畢。
以上的相關(guān)內(nèi)容就是對(duì)SQL Server層次結(jié)構(gòu)的展開的介紹,望你能有所收獲。
【編輯推薦】