我們在平常的系統開發中常常會遇到像無限級分類這樣的樹型結構數據,現提供一個可用的數據庫存儲過程,可以完成樹型結構數據的排序。
環境:Windows7+SQL Server 2008
說明:下面代碼已經轉換成SQL Server2000的腳本,處理效果如下,看sortname字段結果,代碼經過測試。
創建樹型表
以下為引用的內容:
CREATE TABLE [dbo].[categorIEs](
[category_id] [int] IDENTITY(1,1) NOT NULL,
[parent_id] [int] NULL,
[category_name] [varchar](500) NULL,
CONSTRAINT [PK_categorIEs] PRIMARY KEY CLUSTERED
(
[category_id] ASC
) ON [PRIMARY]
) ON [PRIMARY]
GO
插入測試數據
以下為引用的內容:
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (1, 0, CONVERT(TEXT, N'A'))
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (2, 0, CONVERT(TEXT, N'B'))
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (3, 1, CONVERT(TEXT, N'AA'))
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (4, 3, CONVERT(TEXT, N'AAA'))
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (5, 2, CONVERT(TEXT, N'BB'))
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (6, 1, CONVERT(TEXT, N'AA2'))
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (7, 1, CONVERT(TEXT, N'AA3'))
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (8, 3, CONVERT(TEXT, N'AAA2'))
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (9, 4, CONVERT(TEXT, N'AAA3'))
INSERT [dbo].[categorIEs] ([category_id], [parent_id], [category_name]) VALUES (10, 2, CONVERT(TEXT, N'BB2'))
創建存儲過程,表中的level為級別深度,通過生成的臨時表與分類表關聯顯示結果。
以下為引用的內容:
CREATE PROCEDURE [dbo].[Get_TreeData]
AS
BEGIN
--創建臨時表
create table #tmp_table (id int,[level] int)
declare @LevelValue int
set @LevelValue=0
insert #tmp_table select 0,@LevelValue
--將數據寫入到臨時表
while @@rowcount>0
begin
set @LevelValue=@LevelValue+1
insert #tmp_table select a.category_id,@LevelValue
from categorIEs as a,#tmp_table as b
where a.parent_id=b.[id] and b.[level]=@LevelValue-1
end
--select * from #tmp_table
select a.category_id,a.parent_id,a.category_name,b.[level],
case
when a.parent_id=0 then a.category_name else replicate('-',b.[level])+a.category_name
end as sortname
from categorIEs as a join #tmp_table as b on a.category_id=b.id
order by sortname
return
END