【发布时间】:2019-01-08 20:21:33
【问题描述】:
我将 SQL Server 报告应用程序中的逗号分隔字段替换为多对多关系。应用程序代码暂时无法替换,因此我需要派生它当前期望的相同 CSV 列。我过去使用过FOR XML PATH 技巧,它似乎是一种基于集合的快速解决方案,应该易于实施。
我当前的查询如下所示:
SELECT
Report = rr.Report_ID,
RoleList = STUFF((SELECT ', ' + r.[Name] AS [text()]
FROM [dbo].[Role] r
WHERE r.Role_ID = rr.Role_ID
FOR XML PATH ('')), 1, 1, '')
FROM
[dbo].ReportRole rr
ORDER BY
rr.Report_ID;
我的期望是这样的:
Report RoleList
--------------------------------------------------------------------
2 Senior Application Developer
3 Senior Application Developer, Manager Information Systems
但我得到的是这个:
Report RoleList
--------------------------------------
2 Senior Application Developer
3 Senior Application Developer
3 Manager Information Systems
我使用的是 SQL Server 2017。此版本是否不支持以前版本的 XML-to-CSV hack?
【问题讨论】:
-
您似乎想使用
WHERE r.Report_ID = rr.Report_ID而不是WHERE r.Role_ID = rr.Role_ID,但由于您不会共享 DDL,我们怎么知道? -
原始数据将帮助我们理解这里。我们看不到你所看到的。
-
表被规范化,连接表是一个简单的多对多 ID 映射。 Role 没有 Report_ID,Report 也没有 Role_ID。 @Paurian 的回答解决了这个问题。
标签: sql-server tsql sql-server-2017