Если вы используете SQL Server 2005 или новее, вы можете использовать для этого рекурсивный CTE (общее табличное выражение) (см. Электронная документация MSDN Books для получения более подробной информации)..
По сути, это «встроенное представление» - представление, которое существует только для следующего оператора.Одна версия CTE разработана специально для обработки рекурсивных сценариев.
Это выглядит примерно так:
CREATE PROCEDURE dbo.RecurseObjects @ObjectID INT
AS BEGIN
WITH ObjectCTE AS
(
-- set the anchor - select the object defined
SELECT o.id AS 'ID', CAST(NULL AS INT) AS 'ParentID', 1 AS 'Level'
FROM dbo.Object o
WHERE o.id = @ObjectID
-- add recursion
UNION ALL
SELECT o2.id AS 'ID', cte.id AS 'ParentID', cte.Level + 1 AS 'Level'
FROM dbo.Object o2
INNER JOIN dbo.ObjectDependency od ON od.dependency_id = o2.id
INNER JOIN ObjectCTE cte ON cte.id = od.object_id
)
SELECT *
FROM ObjectCTE
END
Итак, этот рекурсивный CTE запускается поэтапно:
- первый «запуск» устанавливает привязку, то есть выполняется первый
SELECT
, а результаты сохраняются во временном наборе результатов , затем обрабатывается рекурсия: второй выборвыполняется, в основном выбирая все строки, которые зависят от строк, выбранных в первом запуске - все те, которые связаны следующим образом:
object.id --> objectdepedency.dependecy_id
objectdepedency.object_id --> "parent" object.id
Этот второй шаг повторяетсяснова и снова, пока больше не будет извлечено дополнительных строк - тогда возвращается набор результатов.