这个查询是如何创建逗号分隔列表的SQL Server?
发布时间:2020-12-12 08:38:03 所属栏目:MsSql教程 来源:网络整理
导读:我已经在google的帮助下编写了这个查询,以从表中创建一个分隔列表,但是我从这个查询中不了解任何内容. 任何人都可以解释我发生了什么 SELECT E1.deptno,allemp = Replace ((SELECT E2.ename AS 'data()' FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR xml
我已经在google的帮助下编写了这个查询,以从表中创建一个分隔列表,但是我从这个查询中不了解任何内容.
任何人都可以解释我发生了什么 SELECT E1.deptno,allemp = Replace ((SELECT E2.ename AS 'data()' FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR xml PATH('')),' ',',') FROM EMP AS e1 GROUP BY DEPTNO; 给我结果 10 CLARK,KING,MILLER 20 SMITH,JONES,SCOTT,ADAMS,FORD 30 ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES 解决方法解释它的最简单的方法是查看FOR XML PATH如何为实际的XML工作.想象一下简单的表员工:EmployeeID Name 1 John Smith 2 Jane Doe 你可以使用 SELECT EmployeeID,Name FROM emp.Employee FOR XML PATH ('Employee') 这将创建XML如下 <Employee> <EmployeeID>1</EmployeeID> <Name>John Smith</Name> </Employee> <Employee> <EmployeeID>2</EmployeeID> <Name>Jane Doe</Name> </Employee> 从PATH中删除“Employee”会删除外部的xml标签,以便查询: SELECT Name FROM Employee FOR XML PATH ('') 会创造 <Name>John Smith</Name> <Name>Jane Doe</Name> 然后你做的不是很理想,列名’data()’强制出现一个sql错误,因为它试图创建一个不合法的标签的xml标签,因此会产生以下错误:
相关子查询隐藏此错误,只生成不带标签的XML: SELECT Name AS [Data()] FROM Employee FOR XML PATH ('') 创建 John Smith Jane Doe 你正在用逗号替换空格,相当自我解释… 如果我是你,我会稍微调整一下查询: SELECT E1.deptno,STUFF(( SELECT ',' + E2.ename FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR XML PATH('') ),1,2,'') FROM EMP AS e1 GROUP BY DEPTNO; 没有列别名意味着没有创建xml标签,并且在选择查询中添加逗号意味着任何具有空格的名称都不会导致错误,STUFF将删除第一个逗号和空格. 附录 要详细说明KM在评论中所说的话,因为这似乎还有更多的意见,正确的方式来排除XML字符将是使用.value如下: SELECT E1.deptno,' + E2.ename FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR XML PATH(''),TYPE ).value('.','NVARCHAR(MAX)'),'') FROM EMP AS e1 GROUP BY DEPTNO; (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |