循环数据集上的TSQL递归查询

循环数据集上的TSQL递归查询,sql,sql-server-2008,tsql,recursion,Sql,Sql Server 2008,Tsql,Recursion,请查找以下代码: WITH CTE(col1, col2, col3, Hier) AS ( SELECT t.col1, t.col2, t.col3, CAST('/' + LTRIM(t.col2) + '/' AS VARCHAR(MAX)) FROM TABLE t WHERE t.col2 = 1 UNION ALL SELECT

请查找以下代码:

WITH
CTE(col1, col2, col3, Hier) AS (
       SELECT
         t.col1,
         t.col2,
         t.col3,
         CAST('/' + LTRIM(t.col2) + '/' AS VARCHAR(MAX))
         FROM TABLE t
        WHERE t.col2 = 1

       UNION ALL

        SELECT
          t.col1,
          t.col2,
          t.col3,
          hier + CAST(t.col2 AS VARCHAR(MAX)) +'/'
          FROM TABLE T 
         INNER JOIN CTE ON T.col3 = CTE.col3
         WHERE CTE.Hier NOT LIKE '%/' + CAST(T.col2 AS VARCHAR(MAX)) + '/%'
)
我对进入无限循环的上述查询有一个问题。基本上,我的数据集包含许多数据循环,通常的层次结构检查无法正常工作,下面将详细介绍为什么它无法正常工作

我考虑过使用一个表变量来存储条目,然后在递归查询部分检查它,但是找不到从递归查询中插入到所述表变量的方法

我也考虑过用C编写函数和重写,但我认为在TSQL中这样做肯定还有一段路要走

任何想法/解决方案都会很棒

为什么它不起作用

在我的查询中有20多个递归,下面是一个简短的示例摘录

 T.col1 | T.col2 | T.col3 |               Hier
-------------------------------------------------------------
   1    |   2    |   3    |   /2/
   1    |   2    |   5    |   /2/
   1    |   3    |   3    |   /2/3/

 >>>>> Later In Query Results

  56    |  57    |   3    |   /2/3/5/6/32/34/36/47/48/50/57
  56    |  57    |   3    |   /2/3/5/6/32/34/36/47/48/50/52/57
除Hier列外,底部行与上面的行相同,它的出现是因为条目1的T.col3值为3,因此它被联接,而最新记录的T.col2的值为57,而该值没有出现在条目1的Hier中,因此它被添加,并且由于始终是连续添加行的情况,因此查询继续进行跑


我没有包括数据集,因为在循环实际开始之前需要大约500多条记录,希望我提供了足够的信息来了解我的问题。

Hi,根据显示的有限数据量,这对于您希望在继承人专栏中看到的内容有点混乱,你能扩展和添加一点样本数据吗?正如@JamiePollard所说的,一个简单的“数据循环”的例子会有所帮助。纯CTE和C重写之间的中间方法是T-SQL中的迭代方法,使用WHILE循环和临时表。这是因为在CTE的第一部分中,您选择的父节点不是从表中的根节点开始,它应该类似于T.col2为null的位置。