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