Сохранить временный список в рекурсивной хранимой процедуре - PullRequest
1 голос
/ 05 декабря 2010

Я хочу сделать хранимую процедуру, которая делается рекурсивной

База данных содержит список частей, и часть может быть "заключена в" другую часть, так что эта "содержится в" имеет идентификатор

Затем я хочу сделать функцию, которая

Это займет один параметр "ID"

Печать ID

Найти идентификатор на оборудовании, которое в нем равно этому идентификатору

Сохранить эти идентификаторы в списке

Вызовите эту функцию снова со всеми идентификаторами в списке

Как мне составить этот список

1 Ответ

3 голосов
/ 05 декабря 2010

Если это SQL Server 2005+, используйте встроенный TVF, содержащий рекурсивный CTE.Пример ниже.

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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...