J'ai une table qui a une clé étrangère auto-référencée qui représente sa ligne parent. Pour illustrer le problème dans sa forme la plus simple, nous allons utiliser cette table :
CREATE TABLE Folder(
id int IDENTITY(1,1) NOT NULL, --PK
parent_id int NULL, --FK
folder_name varchar(255) NOT NULL)
Je veux créer une fonction à valeur scalaire qui renverrait une chaîne concaténée du nom du dossier et de tous ses noms de dossiers parents jusqu'au dossier racine, qui serait désigné par une valeur parent_id nulle.
Ma solution actuelle est une approche procédurale qui, je le suppose, n'est pas idéale. Voici ce que je fais :
CREATE FUNCTION dbo.GetEntireLineage
(@folderId INT)
RETURNS VARCHAR(MAX)
AS
BEGIN
DECLARE @lineage VARCHAR(MAX)
DECLARE FolderId INT
SELECT @lineage = folder_name, FolderId = parent_id FROM Folder WHERE id = @folderId
WHILE NOT FolderId IS NULL
BEGIN
SET FolderId = (SELECT parent_id FROM Folder WHERE parent_id = FolderId)
SET @lineage = (SELECT @lineage + '-' + (SELECT folder_name FROM Folder WHERE parent_id = FolderId))
END
RETURN @lineage
END
Existe-t-il un moyen plus idéal de procéder ? Je suis un programmeur expérimenté mais T-SQL n'est pas un monde familier pour moi et je sais que ces problèmes nécessitent généralement une approche différente en raison de la nature des données basées sur des ensembles. Si vous m'aidez à trouver une solution ou si vous me donnez d'autres conseils et astuces pour utiliser T-SQL, je vous en serai reconnaissant.