【发布时间】: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.UserGroupName是nvarchar(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