Sql server 如何将T-SQL CTE查询中的uniqueidentifier ID组合成字符串
我想在T-SQL CTE查询中生成带有逗号分隔为字符串的Sql server 如何将T-SQL CTE查询中的uniqueidentifier ID组合成字符串,sql-server,tsql,sql-cte,Sql Server,Tsql,Sql Cte,我想在T-SQL CTE查询中生成带有逗号分隔为字符串的uniqueidentifierID: WITH departmentcte(ID, Name, ParentID, LEVEL, FullPath) AS ( SELECT ID, Name, ParentID, 0 AS LEVEL, CAST(Name AS VARCHAR(1024)) AS FullPath FROM ItemModels WHER
uniqueidentifier
ID:
WITH departmentcte(ID, Name, ParentID, LEVEL, FullPath) AS
(
SELECT
ID, Name, ParentID, 0 AS LEVEL,
CAST(Name AS VARCHAR(1024)) AS FullPath
FROM
ItemModels
WHERE
ParentID IS NULL
UNION ALL
SELECT
d.ID, d.Name, d.ParentID, departmentcte.LEVEL + 1 AS LEVEL,
CAST(departmentcte.FullPath + '\' + CAST(d.Name AS VARCHAR(1024)) AS VARCHAR(1024)) AS FullPath
FROM
ItemModels d
INNER JOIN
departmentcte ON departmentcte.ID = d.ParentID
)
SELECT ID, Name, FullPath
FROM departmentcte;
它按预期返回此结果:
但是我想得到一个子集的所有ID,比如
所以我尝试下面的查询,我得到了错误
“子ID”中绑定部分和递归部分之间的类型不匹配
递归“departmentcte”查询的列
正如我看到的,SubIDs具有nvarchar数据类型,那么问题出在哪里呢?多亏了我找到的所有解决方案
WITH departmentcte(ID,ParentID, LEVEL, FullPath, SubIDs) AS
( SELECT ID, ParentID, 0 AS LEVEL, CAST(Name AS VARCHAR(1024)) AS FullPath, convert(varchar(2048), ID) as SubIDs
FROM ItemModels WHERE ParentID IS NULL
UNION ALL
SELECT d.ID, d.ParentID, departmentcte.LEVEL + 1 AS LEVEL,
CAST( departmentcte.FullPath + ',' + CAST(d.Name AS VARCHAR(1024)) AS VARCHAR(1024)) AS FullPath,
CAST( ISNULL(departmentcte.SubIDs,'') + ',' + convert(nvarchar(36), d.ID) AS VARCHAR(2048)) AS SubIDs
FROM ItemModels d INNER JOIN departmentcte ON departmentcte.ID = d.ParentID)
SELECT * FROM departmentcte;
其思想是在UNION ALL
的两个字段中使用相同大小的varchar/nvarchar
。
在我的例子中,它是
varchar(2048)
,我正要发布一个与此非常类似的答案。顺便说一下,下次您询问时,请提供演示链接或一些示例数据。对于你上面提出的问题,大多数人帮不了你多少忙。
WITH departmentcte(ID,ParentID, LEVEL, FullPath, SubIDs) AS
( SELECT ID, ParentID, 0 AS LEVEL, CAST(Name AS VARCHAR(1024)) AS FullPath, convert(varchar(2048), ID) as SubIDs
FROM ItemModels WHERE ParentID IS NULL
UNION ALL
SELECT d.ID, d.ParentID, departmentcte.LEVEL + 1 AS LEVEL,
CAST( departmentcte.FullPath + ',' + CAST(d.Name AS VARCHAR(1024)) AS VARCHAR(1024)) AS FullPath,
CAST( ISNULL(departmentcte.SubIDs,'') + ',' + convert(nvarchar(36), d.ID) AS VARCHAR(2048)) AS SubIDs
FROM ItemModels d INNER JOIN departmentcte ON departmentcte.ID = d.ParentID)
SELECT * FROM departmentcte;