SQL Server CTE语句Varbinary(MAX)未返回RootID

SQL Server CTE语句Varbinary(MAX)未返回RootID,sql,sql-server,stored-procedures,common-table-expression,varbinarymax,Sql,Sql Server,Stored Procedures,Common Table Expression,Varbinarymax,我有一个层次表来存储二叉树。我正在使用递归查询来检索树级别,它基于introductID作为“RootID”。返回的值与我预期的一样,但在AgentId数量增量达到116后,此CTE查询不会以分层形式返回级别值 就像它不能再跟踪RootID一样 这就是我的桌子结构的样子 CREATE TABLE [dbo].[TblHierarchy] ( [ID] [bigint] IDENTITY(1,1) NOT NULL, [AgentID] [bigint] NULL,

我有一个层次表来存储二叉树。我正在使用递归查询来检索树级别,它基于
introductID
作为“RootID”。返回的值与我预期的一样,但在
AgentId
数量增量达到116后,此CTE查询不会以分层形式返回级别值

就像它不能再跟踪RootID一样

这就是我的桌子结构的样子

CREATE TABLE [dbo].[TblHierarchy]
(
      [ID] [bigint] IDENTITY(1,1) NOT NULL,
      [AgentID] [bigint] NULL,
      [AgentName] [varchar](50) NULL,
      [RootID] [bigint] NULL,
      [IntroducerID] [bigint] NULL,
      [Description] [varchar](50) NULL,
      [HierarchyTree] [hierarchyid] NULL
) ON [PRIMARY]
以下是表格中的样本数据

INSERT [dbo].[TblHierarchy] ([ID], [AgentID], [AgentName], [RootID], [IntroducerID], [Description], [HierarchyTree]) 
VALUES (1, 1, N'Toh', 0, NULL, N'', NULL)

INSERT [dbo].[TblHierarchy] ([ID], [AgentID], [AgentName], [RootID], [IntroducerID], [Description], [HierarchyTree]) 
VALUES (2, 2, N'Man', 1, 0, N'Child of Toh', NULL)

INSERT [dbo].[TblHierarchy] ([ID], [AgentID], [AgentName], [RootID], [IntroducerID], [Description], [HierarchyTree]) 
VALUES (3, 3, N'Rul', 1, 0, N'Child of Toh', NULL)

INSERT [dbo].[TblHierarchy] ([ID], [AgentID], [AgentName], [RootID], [IntroducerID], [Description], [HierarchyTree]) 
VALUES (4, 4, N'Rafiq', 2, 2, N'Child of Man', NULL)

INSERT [dbo].[TblHierarchy] ([ID], [AgentID], [AgentName], [RootID], [IntroducerID], [Description], [HierarchyTree]) 
VALUES (5, 5, N'Paan', 2, 2, N'Child of Man', NULL)
这是检索信息的查询

WITH CTE AS
(
    SELECT 
        H1.AgentID,
        H1.RootID,
        H1.AgentName,
        H1.Description [Parent],
        Description [Self Description],
        CAST(AgentID AS varbinary(MAX)) [Level],
        CAST (h1.AgentID AS varchar(max)) [LevelID],
        CAST (H1.IntroducerID AS varchar(max)) [IntroducerID]
    FROM 
        TblHierarchy H1
    WHERE 
        H1.RootID = 3

    UNION ALL 

    SELECT 
        H2.AgentID,
        H2.RootID,
        H2.AgentName,
        c.[Self Description],
        Description [Self Description],
        c.[Level]+CAST(h2.AgentID AS varbinary(MAX)) AS [Level] ,
        c.[LevelID] + '>' + CAST (h2.AgentID AS varchar(max)) [LevelID],
        CAST (H2.IntroducerID AS varchar(max)) [IntroducerID]
    FROM
        TblHierarchy H2
    INNER JOIN 
        CTE c ON h2.RootID = c.AgentID
)
SELECT *
FROM CTE 
CROSS APPLY 
    (SELECT 
         SUBSTRING(LevelID, 1, CHARINDEX('>', LevelID + '>') - 1) ) c(RootLevelID) 
ORDER BY 
    [Level] DESC
OPTION (MAXRECURSION 0) 

我不完全理解您的需求(尤其是您试图通过所有这些角色实现的目标…),但请查看以下内容:

编辑:经过一些思考,我希望我得到了它 我删除了以前的建议,在那里我必须更改您的输入数据。下面使用未更改的输入数据,并通过AgentID和RootID链接

CREATE TABLE [dbo].[TblHierarchy](
      [ID] [bigint] IDENTITY(1,1) NOT NULL,
      [AgentID] [bigint] NULL,
      [AgentName] [varchar](50) NULL,
      [RootID] [bigint] NULL,
      [IntroducerID] [bigint] NULL,
      [Description] [varchar](50) NULL,
      [HierarchyTree] [hierarchyid] NULL
      ) ON [PRIMARY];


INSERT [dbo].[TblHierarchy] ( [AgentID], [AgentName], [RootID], [IntroducerID], [Description], [HierarchyTree]) 
VALUES 
( 1, N'Toh', 0, NULL, N'', NULL)
,( 2, N'Man', 1, 0, N'Child of Toh', NULL)
,( 3, N'Rul', 1, 0, N'Child of Toh', NULL)
,( 4, N'Rafiq', 2, 2, N'Child of Man', NULL)
,( 5, N'Paan', 2, 2, N'Child of Man', NULL)

SELECT * FROM dbo.TblHierarchy;

WITH recCTE AS
(
    SELECT h.ID
          ,h.AgentID
          ,h.AgentName
          ,h.RootID
          ,h.IntroducerID
          ,h.[Description]
          ,CAST(h.[Description] AS VARCHAR(MAX)) AS HierDescr
    FROM dbo.TblHierarchy AS h WHERE h.IntroducerID IS NULL

    UNION ALL

    SELECT h.ID
          ,h.AgentID
          ,h.AgentName
          ,h.RootID
          ,h.IntroducerID
          ,h.[Description]
          ,r.HierDescr + '/' + h.[Description]
    FROM recCTE AS r
    INNER JOIN dbo.TblHierarchy AS h ON h.RootID=r.AgentID
)
SELECT * FROM recCTE
GO
DROP TABLE [dbo].[TblHierarchy];

我不完全理解您的需求(尤其是您试图通过所有这些角色实现的目标…),但请查看以下内容:

编辑:经过一些思考,我希望我得到了它 我删除了以前的建议,在那里我必须更改您的输入数据。下面使用未更改的输入数据,并通过AgentID和RootID链接

CREATE TABLE [dbo].[TblHierarchy](
      [ID] [bigint] IDENTITY(1,1) NOT NULL,
      [AgentID] [bigint] NULL,
      [AgentName] [varchar](50) NULL,
      [RootID] [bigint] NULL,
      [IntroducerID] [bigint] NULL,
      [Description] [varchar](50) NULL,
      [HierarchyTree] [hierarchyid] NULL
      ) ON [PRIMARY];


INSERT [dbo].[TblHierarchy] ( [AgentID], [AgentName], [RootID], [IntroducerID], [Description], [HierarchyTree]) 
VALUES 
( 1, N'Toh', 0, NULL, N'', NULL)
,( 2, N'Man', 1, 0, N'Child of Toh', NULL)
,( 3, N'Rul', 1, 0, N'Child of Toh', NULL)
,( 4, N'Rafiq', 2, 2, N'Child of Man', NULL)
,( 5, N'Paan', 2, 2, N'Child of Man', NULL)

SELECT * FROM dbo.TblHierarchy;

WITH recCTE AS
(
    SELECT h.ID
          ,h.AgentID
          ,h.AgentName
          ,h.RootID
          ,h.IntroducerID
          ,h.[Description]
          ,CAST(h.[Description] AS VARCHAR(MAX)) AS HierDescr
    FROM dbo.TblHierarchy AS h WHERE h.IntroducerID IS NULL

    UNION ALL

    SELECT h.ID
          ,h.AgentID
          ,h.AgentName
          ,h.RootID
          ,h.IntroducerID
          ,h.[Description]
          ,r.HierDescr + '/' + h.[Description]
    FROM recCTE AS r
    INNER JOIN dbo.TblHierarchy AS h ON h.RootID=r.AgentID
)
SELECT * FROM recCTE
GO
DROP TABLE [dbo].[TblHierarchy];

请提供所提供样品的预期输出配件。为什么要转换为
VARBINARY(MAX)
?请提供所提供样本的预期输出拟合。为什么要强制转换为
VARBINARY(MAX)
?实际上这是我们的客户机要求的逻辑。介绍人可以根据自己的意愿注册任意多个代理,但在二叉树结构中,只能有两个子代理。这意味着,对于第三个代理和其他代理,只要它仍然位于介绍人的主根之下,它就将位于任何位置。回到我的问题,是的,就像你说的,这是一个数据问题。我已经发现了问题。实际上是在插入过程中,我在同一个节点上插入了两个以上的子节点。不管怎样,谢谢你指出这一点。真的要通知它:)实际上,这是我们的客户要求的逻辑。介绍人可以根据自己的意愿注册任意多个代理,但在二叉树结构中,只能有两个子代理。这意味着,对于第三个代理和其他代理,只要它仍然位于介绍人的主根之下,它就将位于任何位置。回到我的问题,是的,就像你说的,这是一个数据问题。我已经发现了问题。实际上是在插入过程中,我在同一个节点上插入了两个以上的子节点。不管怎样,谢谢你指出这一点。真的要通知它:)