【问题标题】:CTE “Types don't match between the anchor and the recursive part”CTE“锚点和递归部分的类型不匹配”
【发布时间】:2018-04-18 15:53:26
【问题描述】:

我知道这个问题已经回答了很多,但我找不到错误。

我收到以下错误:

递归查询“GroupHierarchy”的“父”列中的锚点和递归部分的类型不匹配。

这是查询:

WITH GroupHierarchy (UserGroupName, UserGroupID, IsGroup, Parent, Level)
AS
(
-- Anchor member definition
SELECT ug.UserGroupName, ug.UserGroupID, ug.IsGroup, CAST('' as nvarchar(MAX)) as Parent, 0 AS Level
FROM KnowledgeVaultMaster.dbo.UserGroup AS ug
WHERE ug.IsGroup = 0
UNION ALL
-- Recursive member definition
SELECT ug.UserGroupName, ug.UserGroupID, ug.IsGroup, CAST(gh.UserGroupName as nvarchar(MAX)) as Parent, Level + 1
FROM KnowledgeVaultMaster.dbo.UserGroup AS ug
JOIN KnowledgeVaultMaster.dbo.UserGroupGroup AS ugg
    ON ug.UserGroupID = ugg.ParentUserGroupId
INNER JOIN GroupHierarchy gh
    ON ugg.UserGroupId = gh.UserGroupID
)
-- Statement that executes the CTE
SELECT UserGroupName, UserGroupID, IsGroup, Parent, Level
FROM GroupHierarchy

原来的列UserGroup.UserGroupNamenvarchar(255), not null

编辑:这些是表格(省略了约束和默认值):

CREATE TABLE [dbo].[UserGroup](
    [UserGroupID] [bigint] IDENTITY(1,1) NOT NULL,
    [UserGroupName] [nvarchar](255) NOT NULL,
    [SystemName] [nvarchar](50) NULL,
    [UserPassword] [nvarchar](50) NULL,
    [Salt] [nvarchar](20) NULL,
    [IsGroup] [tinyint] NOT NULL,
    [SuperUser] [bit] NOT NULL,
    [FirstName] [nvarchar](50) NULL,
    [LastName] [nvarchar](100) NULL,
    [Email] [nvarchar](100) NULL,
    [CreateDate] [datetime] NOT NULL,
    [CreateUserID] [bigint] NOT NULL,
    [AuthType] [int] NOT NULL,
    [Active] [bit] NOT NULL
) ON [PRIMARY] GO

CREATE TABLE [dbo].[UserGroupGroup](
    [UserGroupId] [bigint] NOT NULL,
    [ParentUserGroupId] [bigint] NOT NULL
) ON [PRIMARY] GO

【问题讨论】:

  • 那么为什么要把它设为最大呢?为什么不使用 nvarchar(255)?只是想知道。
  • 我不知道你为什么会收到这个错误,对我来说似乎没问题。但我相信你在查询逻辑上有错误。你会陷入死循环
  • @uzi 如果没有循环,它应该在父母用完时终止
  • 不应该是递归部分的第一个谓词是ON ug.ParentUserGroupID = ugg.UserGroupId 而不是ON ug.UserGroupID = ugg.ParentUserGroupId
  • 这是实际查询还是您“简化”了它?如果是后者,我怀疑您已经删除了意味着错误现在不存在的重要细节。如果是前者,我看不到错误是如何表现出来的。 IE。如果这是实际查询,则不清楚您为什么要进行任何类型转换。

标签: sql-server common-table-expression


【解决方案1】:

我终于找到了问题所在。数据库以兼容级别SQL Server 2012 (110) 导入。

我将其更改为 SQL Server 2016 (130),现在 cte 可以工作了。

【讨论】:

    猜你喜欢
    • 2019-05-01
    • 2010-12-22
    • 2018-09-30
    • 1970-01-01
    • 1970-01-01
    • 2014-07-13
    • 1970-01-01
    • 2011-09-11
    • 1970-01-01
    相关资源
    最近更新 更多