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