2010-12-05 24 views
1

Je veux faire une procédure stockée qui est fait récursiveEnregistrer la liste temp récursive procédure stockée

La base de données a une liste de pièces, et une partie peut être « containedin » une autre partie si cette « containedin » a une ID

Je veux alors une fonction qui

Il prendra un paramètre "ID"

Imprimer ID

ID Recherche sur équipement containedin est égal à cet ID

Enregistrer ces ID dans une liste

appeler cette fonction à nouveau avec tous les ID dans la liste

Comment puis-je faire cette liste

+0

Quels SGBDR et version? –

Répondre

3

Si cela est SQL Server 2005+ utilise ensuite un TVF en ligne qui contient un CTE récursif. Exemple ci-dessous.

USE tempdb; 

CREATE TABLE dbo.EquipElement(
EquipmentID int not null primary key, 
ContainedIn int null references EquipElement(EquipmentID), 
Description varchar(20))  

INSERT INTO dbo.EquipElement 
SELECT 1, NULL, 'Breakfast' UNION ALL 
SELECT 2, 1, 'Fry Up' UNION ALL 
SELECT 3, 1, 'Coffee' UNION ALL 
SELECT 4, 2, 'Eggs' UNION ALL 
SELECT 5, 2, 'Bacon' UNION ALL 
SELECT 6, 2, 'Sausages' UNION ALL 
SELECT 7, 3, 'Milk' UNION ALL 
SELECT 8, 3, 'Sugar' 

GO 

CREATE FUNCTION dbo.GetBOM 
( 
    @EquipmentID int 
) 
RETURNS TABLE 
AS 
RETURN 
(
    WITH cte AS 
    (
    SELECT EquipmentID,ContainedIn,Description 
    FROM dbo.EquipElement 
    WHERE EquipmentID = @EquipmentID 
    UNION ALL 
    SELECT e.EquipmentID,e.ContainedIn,e.Description 
    FROM dbo.EquipElement e 
    JOIN cte c on e.ContainedIn = c.EquipmentID 
) 
    SELECT EquipmentID,ContainedIn,Description 
    FROM cte 
) 

GO 

SELECT * FROM dbo.GetBOM(1) 

SELECT * FROM dbo.GetBOM(3) 
+0

Bonne réponse, j'aime les expressions de table communes. Votez. – TarasB

+0

Eh bien à partir de ce que je peux voir, votre exemple ne me donnera pas sous-composants des sous-composants Qu'en est-il de ce http://csharp.pastebin.com/0wUUTFYL – Mech0z

+0

@ Mech0z - Oui, il le fera. Voir mon edit pour un exemple. Il continuera à faire 'UNION ALL' sur le résultat du dernier 'UNION ALL' jusqu'à ce que plus aucun résultat ne soit retourné. Je me rends compte que ce n'est pas très bien exprimé! Meilleure explication [ici] (http://stackoverflow.com/questions/3187850/how-does-a-recursive-cte-run-line-by-line/3187907#3187907) –