如何使用子查询将逗号分隔值插入临时表

时间:2017-08-19 23:40:36

标签: sql-server tsql

我正在尝试使用逗号分隔员工ID的子查询填充临时表中的Employees字段。我的语法不正确。

将逗号分隔的员工ID插入临时表的正确语法是什么?这是我的代码:

declare @CommaSeperatedList varchar(max)

create table #tmp
(
    ManagerId int,
    Employees varchar(max)
)

insert into #tmp (ManagerId, Employees)
    select 
        m.Id, 
        select @CommaSeperatedList = COALESCE(@CommaSeperatedList + ', ', '') + cast(emp.Id as varchar from emp  select @CommaSeperatedList 
    from Manager m
inner join Employee emp on
    m.EmployeeId = emp.Id 

2 个答案:

答案 0 :(得分:2)

除非您使用具有新STRING_AGG功能的SQL Azure或SQL Server 2017,否则最佳选择是使用FOR XML PATH('')方法。

看起来如下......

SELECT 
    e1.mgrid,
    Employees = STUFF((
                SELECT
                    CONCAT(', ', e2.empid)
                FROM 
                    HR.Employees e2
                WHERE 
                    e1.mgrid = e2.mgrid
                FOR XML PATH('')
                ), 1, 2, '')
FROM 
    HR.Employees e1
WHERE 
    e1.mgrid IS NOT NULL 
GROUP BY
    e1.mgrid;

HTH, 杰森

答案 1 :(得分:0)

您可以使用这些示例来了解如何连接行。小心使用XML PATH - 它无法消除你的CPU性能。但如果它不是太多行,我会选择XML PATH。

在这里寻找更多选项https://www.red-gate.com/simple-talk/sql/t-sql-programming/concatenating-row-values-in-transact-sql/

示例可能是这样的:

SELECT ',' + SUB.Name AS [text()] FROM Production.ProductSubcategory SUB WHERE SUB.ProductCategoryID = CAT.ProductCategoryID FOR XML PATH('') , 1, 1, '' ) AS [Sub Categories] FROM Production.ProductCategory CAT