Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 如何将T-SQL CTE查询中的uniqueidentifier ID组合成字符串_Sql Server_Tsql_Sql Cte - Fatal编程技术网

Sql server 如何将T-SQL CTE查询中的uniqueidentifier ID组合成字符串

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

我想在T-SQL CTE查询中生成带有逗号分隔为字符串的
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;