【发布时间】:2012-06-29 03:35:42
【问题描述】:
我有下面的存储过程来返回工作正常的 Id、parentId 和 absoluteUrls 列表:
ALTER PROCEDURE [dbo].[SearchDataManager.HierarchyById]
@currentId AS int
AS
BEGIN
DECLARE @id INT
DECLARE @parentId INT
DECLARE @absoluteUrl NVARCHAR(1000)
DECLARE @Hierarchy TABLE (Id int, ParentId int, AbsoluteUrl nvarchar(1000))
WHILE @currentId != 0
BEGIN
SELECT @id = Id, @parentId = ParentId, @absoluteUrl = AbsoluteUrl
FROM dbo.[SearchDataManager.NiceUrls]
WHERE id = @currentId
INSERT INTO @Hierarchy VALUES (@id, @parentId, @absoluteUrl)
SET @currentId = @parentId
END
SELECT * FROM @Hierarchy
END
“NiceUrls”表具有 Id 和 ParentId。 parentId 引用同一张表中的一条记录。
返回如下:
----------------------------------
Id | ParentId | AbsoluteUrl
----------------------------------
294 | 5 | url1
5 | 2 | url2
2 | 0 | url3
上面的代码使用 WHILE 循环并定义了一个 Table 变量可以正常工作,但我只是想知道有没有更好的方法从表中检索层次结构数据?
上述代码的问题在于可维护性。如果我需要返回 NiceUrls 表的 1 列,那么我必须定义一个新变量,将该列添加到内联表中,等等。
有没有更好的重写sp的方法?
谢谢,
这是什么
【问题讨论】:
-
递归 CTE 应该满足您的需求 - msdn.microsoft.com/en-us/library/ms186243(v=sql.105).aspx
标签: sql-server tsql while-loop hierarchy