【发布时间】:2011-07-14 03:32:58
【问题描述】:
我有一个表,它有一个代表其父行的自引用外键。为了以最简单的形式说明问题,我们将使用下表:
CREATE TABLE Folder(
id int IDENTITY(1,1) NOT NULL, --PK
parent_id int NULL, --FK
folder_name varchar(255) NOT NULL)
我想创建一个标量值函数,它将文件夹名称及其所有父文件夹名称的串联字符串返回到根文件夹,该根文件夹将由 null parent_id 值指定。
我目前的解决方案是一种我认为并不理想的程序方法。这是我正在做的事情:
CREATE FUNCTION dbo.GetEntireLineage
(@folderId INT)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @lineage VARCHAR(MAX)
DECLARE @parentFolderId INT
SELECT @lineage = folder_name, @parentFolderId = parent_id FROM Folder WHERE id = @folderId
WHILE NOT @parentFolderId IS NULL
BEGIN
SET @parentFolderId = (SELECT parent_id FROM Folder WHERE parent_id = @parentFolderId)
SET @lineage = (SELECT @lineage + '-' + (SELECT folder_name FROM Folder WHERE parent_id = @parentFolderId))
END
RETURN @lineage
END
有没有更理想的方法来做到这一点?我是一位经验丰富的程序员,但 T-SQL 对我来说并不熟悉,我知道由于基于集合的数据的性质,这些问题通常需要不同的方法。任何帮助寻找解决方案或处理 T-SQL 的任何其他提示和技巧将不胜感激。
【问题讨论】:
标签: sql sql-server database tsql stored-procedures