Каков наиболее эффективный способ конкатенации строки из всех родительских строк с помощью T-SQL?

) У меня есть таблица с самореференционным внешним ключом, представляющим ее родительскую строку. Чтобы проиллюстрировать проблему в ее простейшей форме, мы воспользуемся этой таблицей:

CREATE TABLE Folder(
    id int IDENTITY(1,1) NOT NULL, --PK
    parent_id int NULL,        --FK
    folder_name varchar(255) NOT 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

Есть ли более идеальный способ сделать это? I ' Я опытный программист, но T-SQL мне не знаком, и я знаю, что эти проблемы обычно требуют другого подхода из-за природы данных на основе наборов. Любая помощь в поиске решения или любые другие советы и рекомендации по работе с T-SQL были бы очень признательны.

8
задан w.brian 14 July 2011 в 03:32
поделиться