如何将递归 CTE 的结果存储在 SQL 中?
How can I store the result of a recursive CTE in SQL?
如果我有这样的递归 CTE,如何将结果存储在变量中?
WITH MyCTE (ChildID, ParentID)
AS
(
SELECT ID, ParentID From MyTable
WHERE ID = 1
UNION ALL
SELECT MT.ID, MT.ParentID
FROM MyCTE Child
JOIN MyTable MT ON MT.ID = Child.ParentID
WHERE Child.ParentID IS NOT NULL
)
SELECT COUNT(*)
FROM MyCTE
OPTION (MAXRECURSION 20)
我尝试了以下方法,但 SSMS 抱怨两个选项中的语法:
DECLARE @numberOfRecords int = (
WITH MyCTE (ChildID, ParentID)
AS
(
SELECT ID, ParentID From MyTable
WHERE ID = 1
UNION ALL
SELECT MT.ID, MT.ParentID
FROM MyCTE Child
JOIN MyTable MT ON MT.ID = Child.ParentID
WHERE Child.ParentID IS NOT NULL
)
SELECT COUNT(*)
FROM MyCTE
OPTION (MAXRECURSION 20))
和
WITH MyCTE (ChildID, ParentID)
AS
(
SELECT ID, ParentID From MyTable
WHERE ID = 1
UNION ALL
SELECT MT.ID, MT.ParentID
FROM MyCTE Child
JOIN MyTable MT ON MT.ID = Child.ParentID
WHERE Child.ParentID IS NOT NULL
)
DECLARE @numberOfRecords int = (
SELECT COUNT(*)
FROM MyCTE
OPTION (MAXRECURSION 20))
可以先声明变量再赋值:
DECLARE @numberOfRecords int;
WITH MyCTE (ChildID, ParentID) AS (
SELECT ID, ParentID
FROM MyTable
WHERE ID = 1
UNION ALL
SELECT MT.ID, MT.ParentID
FROM MyCTE Child JOIN
MyTable MT
ON MT.ID = Child.ParentID
WHERE Child.ParentID IS NOT NULL
)
SELECT @numberOfRecords = COUNT(*)
FROM MyCTE
OPTION (MAXRECURSION 20);
如果我有这样的递归 CTE,如何将结果存储在变量中?
WITH MyCTE (ChildID, ParentID)
AS
(
SELECT ID, ParentID From MyTable
WHERE ID = 1
UNION ALL
SELECT MT.ID, MT.ParentID
FROM MyCTE Child
JOIN MyTable MT ON MT.ID = Child.ParentID
WHERE Child.ParentID IS NOT NULL
)
SELECT COUNT(*)
FROM MyCTE
OPTION (MAXRECURSION 20)
我尝试了以下方法,但 SSMS 抱怨两个选项中的语法:
DECLARE @numberOfRecords int = (
WITH MyCTE (ChildID, ParentID)
AS
(
SELECT ID, ParentID From MyTable
WHERE ID = 1
UNION ALL
SELECT MT.ID, MT.ParentID
FROM MyCTE Child
JOIN MyTable MT ON MT.ID = Child.ParentID
WHERE Child.ParentID IS NOT NULL
)
SELECT COUNT(*)
FROM MyCTE
OPTION (MAXRECURSION 20))
和
WITH MyCTE (ChildID, ParentID)
AS
(
SELECT ID, ParentID From MyTable
WHERE ID = 1
UNION ALL
SELECT MT.ID, MT.ParentID
FROM MyCTE Child
JOIN MyTable MT ON MT.ID = Child.ParentID
WHERE Child.ParentID IS NOT NULL
)
DECLARE @numberOfRecords int = (
SELECT COUNT(*)
FROM MyCTE
OPTION (MAXRECURSION 20))
可以先声明变量再赋值:
DECLARE @numberOfRecords int;
WITH MyCTE (ChildID, ParentID) AS (
SELECT ID, ParentID
FROM MyTable
WHERE ID = 1
UNION ALL
SELECT MT.ID, MT.ParentID
FROM MyCTE Child JOIN
MyTable MT
ON MT.ID = Child.ParentID
WHERE Child.ParentID IS NOT NULL
)
SELECT @numberOfRecords = COUNT(*)
FROM MyCTE
OPTION (MAXRECURSION 20);