相关疑难解决方法(0)

如何在Table-Valued-Function中为CTE设置maxrecursion选项

我面临一个问题,即在TVF内声明CTE的maxrecursion选项

这是CTE(一个简单的日历):

DECLARE @DEBUT DATE = '1/1/11',   @FIN DATE = '1/10/11';

WITH CTE as(       
SELECT @debut as jour       
UNION ALL       
SELECT DATEADD(day, 1, jour)       
FROM   CTE      
WHERE  DATEADD(day, 1, jour) <= @fin)
SELECT jour FROM CTE option (maxrecursion 365)
Run Code Online (Sandbox Code Playgroud)

和TVF:

 CREATE FUNCTION [liste_jour]  
 (@debut date,@fin date)
 RETURNS TABLE
 AS     
 RETURN      
 (  
  WITH CTE as(       
  SELECT @debut as jour       
  UNION  ALL       
  SELECT DATEADD(day, 1, jour)       
  FROM   CTE      
  WHERE  DATEADD(day, 1, jour) <= @fin)
  SELECT jour FROM CTE
  --option (maxrecursion 365)
 ) …
Run Code Online (Sandbox Code Playgroud)

sql-server common-table-expression

37
推荐指数
2
解决办法
4万
查看次数

SQL Server:如何将CTE递归限制为只是递归添加的行?

更简单的例子

让我们尝试一个更简单的例子,这样人们可以围绕这些概念,并有一个实际的例子,你可以复制并粘贴到SQL Query Analizer:

想象一个具有层次结构的节点表:

A
 - B
    - C
Run Code Online (Sandbox Code Playgroud)

我们可以在Query Analizer中开始测试:

CREATE TABLE ##Nodes
(
 NodeID varchar(50) PRIMARY KEY NOT NULL,
 ParentNodeID varchar(50) NULL
)

INSERT INTO ##Nodes (NodeID, ParentNodeID) VALUES ('A', null)
INSERT INTO ##Nodes (NodeID, ParentNodeID) VALUES ('B', 'A')
INSERT INTO ##Nodes (NodeID, ParentNodeID) VALUES ('C', 'B')
Run Code Online (Sandbox Code Playgroud)

期望的输出:

ParentNodeID    NodeID    GenerationsRemoved
============    ======    ==================
NULL            A         1
NULL            B         2
NULL            C         3
A               B         1
A               C         2
B               C         1
Run Code Online (Sandbox Code Playgroud)

现在建议的CTE表达式,输出不正确:

WITH NodeChildren …
Run Code Online (Sandbox Code Playgroud)

sql-server common-table-expression

12
推荐指数
1
解决办法
2万
查看次数