SQL Server層次結構的展開模式
以下的文章主要向大家講述的是SQL Server層次結構的展開模式,在實際操作中如果數據庫經常存儲層次信息的話。如下所示,以下的數據是全球一些地區的層次表示形式。這種表示形式并未清楚地顯示出數據中隱含的結構。
- 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 支持遞歸,但是使用臨時表作為堆棧來跟蹤所有正在處理中的項目(已經開始但尚未結束),將更加有效。某個項目一旦處理完畢,將被從堆棧中刪除。當發現新的項目時,這些項目將被添加到堆棧中。
- CREATE PROCEDURE expand (@current char(20)) as SET NOCOUNT>
輸入參數 (@current) 表示層次中的開始位置。它還跟蹤主循環中的當前項目。
使用的兩個局部變量分別是 @level(用于跟蹤SQL Server層次結構中的當前級別)和 @line(是用于構造縮進行的工作區)。
- SET NOCOUNT>
使用層次中開始點的項目標識符來創建和整理臨時表 #stack,而 @level 被設置為與之匹配。#stack 中的 level 列允許同一個項目出現在數據庫的多個級別中。雖然這種情況不適用于該示例中的地理數據,但是它可以用于其它示例。
在下面的示例中,當 @level 大于 0 時,該過程執行以下步驟:
1.如果當前級別 (@level) 的堆棧中有任何項目,該過程將選擇其中一個,并稱之為 @current。
2.縮進項目 @level 空格,然后打印該項目。
3.從堆棧中刪除該項目以免重復處理它,然后將其所有子項目添加到堆棧的下一級 (@level + 1) 中。這是唯一使用層次表 (#stack) 的地方。
如果使用傳統的編程語言,就必須找到每個子項目并將其逐個添加到堆棧中。而使用 Transact-SQL,只用一個語句就能找到并添加所有的子項目,以免又使用一個嵌套循環。
4.如果有子項目 (IF @@ROWCOUNT > 0),則下降一級處理它們 (@level= @level + 1);否則,繼續在當前級別上處理。
5.***,如果在當前級別的堆棧中沒有待處理的項目,則返回到上一級,看上一級是否有待處理的項目 (@level= @level - 1)。當再沒有上一級時,則展開完畢。
以上的相關內容就是對SQL Server層次結構的展開的介紹,望你能有所收獲。
【編輯推薦】