2009-11-06 5 views
0

J'ai un système de gestion de contenu qui contient une structure hiérarchique de catégories, avec des sous-catégories sujettes à différentes options d'ordonnancement à chaque niveau. Actuellement, cela est récupéré par une (assez grande) série de requêtes ... mais je tente d'accélérer les choses en utilisant une procédure stockée récursive. (Si je comprends bien, utiliser CTE serait le meilleur de tous, mais je ne suis pas sûr qu'il existe un moyen de le faire si la commande peut varier d'un niveau à l'autre.) Si je me trompe, veuillez me corriger. Donc, tout fonctionne bien ... sauf que je n'arrive pas à comprendre comment parcourir les enregistrements pour interroger les enfants de chaque catégorie que je trouve. J'ai essayé d'utiliser un curseur mais, encore une fois, il semble que la commande est un problème. (Et encore, corrigez-moi si je me trompe.)Sélection d'enregistrements pendant une procédure stockée récursive

Voici le code (qui est appelé à partir d'une procédure de parent qui crée la table temporaire):

BEGIN 
SET NOCOUNT ON; 

DECLARE @parent_new int, @custom_order_new varchar(1); 
DECLARE @title varchar(255), @is_nav_hidden bit, @display int; 

-- store the information about this category into the temp table 
IF @parent > 0 
BEGIN 
    INSERT INTO #CategoryListTemp SELECT DISTINCT c.id, c2c.id_parent, c.title, cp.id, c.page_order, null, c.is_published, cu.is_album, u.firstname, u.lastname, c.is_nav_hidden from categories_categories c2c, categories c LEFT JOIN categories_users cu ON c.id=cu.id_category LEFT JOIN users u ON cu.id_user=u.id LEFT JOIN categories_pages cp ON c.id=cp.id_category AND [email protected] where c2c.id_category=c.id and [email protected]; 
END 

-- and then find out about its children 
IF @custom_order='c' BEGIN 
    SELECT DISTINCT @parent_new = c.id, @custom_order_new = c.page_order, @title=c.title, @is_nav_hidden=c.is_nav_hidden from categories_categories c2c, categories c where c2c.id_category=c.id and [email protected] order by c.is_nav_hidden, c.title; 
END 
ELSE 
BEGIN 
    SELECT DISTINCT @parent_new = c.id, @custom_order_new = c.page_order, @is_nav_hidden=c.is_nav_hidden, @display=c2c.display, @title=c.title from categories_categories c2c, categories c where c2c.id_category=c.id and [email protected] order by c.is_nav_hidden, c2c.display, c.title; 
END 

if @parent_new IS NOT NULL BEGIN 
    EXEC GetCategoryListData @id, @parent_new, @custom_order_new 
END 
END 

Les pointeurs seraient très chaleureusement reçus. Merci beaucoup.

+0

Impossible de lire cela. Vous avez besoin de sauts de ligne. Où est la clause FROM? À quoi vous joignez-vous? –

Répondre

1

Je débute sur StackOverflow et je cherche des réponses à vos questions. Le vôtre semble intéressant, MAIS ce serait beaucoup de travail pour créer réellement les enregistrements d'échantillon nécessaires pour développer et tester une réponse.

Une suggestion - utilisez le lien ci-dessous (Comment publier des données/code sur un forum pour obtenir la meilleure aide).

http://www.sqlservercentral.com/articles/Best+Practices/61537/

Il va vous donner des conseils sur la création de scripts de données exemple pour rendre votre problème facile à résoudre répliquer avec espoir.

Sylvia

Questions connexes