在递归存储过程中保存临时列表

时间:2010-12-05 18:19:31

标签: sql stored-procedures

我想制作一个递归的存储过程

数据库有一个零件清单,一个零件可以“包含”另一个零件,所以这个“包含”有一个ID

然后我想制作一个

的功能

将需要一个参数“ID”

打印ID

在包含等于此ID的设备上查找ID

将这些ID保存在列表中

使用列表中的所有ID再次调用此函数

如何制作该列表

1 个答案:

答案 0 :(得分:3)

如果这是SQL Server 2005+,则使用包含递归CTE的内联TVF。以下示例。

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)