使用 FOR XML PATH 在 SQL Server 中创建逗号分隔列表
本示例演示如何使用 FOR XML PATH
从表中创建逗号分隔列表:
<code class="language-sql">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; </code>
详解:
此查询的核心在于 FOR XML PATH
如何处理实际的 XML。考虑一个简化的员工表:
<code>EmployeeID Name 1 John Smith 2 Jane Doe</code>
FOR XML PATH
将数据转换为 XML 格式。执行以下查询:
<code class="language-sql">SELECT EmployeeID, Name FROM emp.Employee FOR XML PATH ('Employee')</code>
会生成以下 XML:
<code class="language-xml"><employee><employeeid>1</employeeid><name>John Smith</name></employee><employee><employeeid>2</employeeid><name>Jane Doe</name></employee></code>
从 PATH 子句中省略 'Employee' 元素会移除外部 XML 标签。修改后的查询:
<code class="language-sql">SELECT Name FROM Employee FOR XML PATH ('')</code>
会生成:
<code class="language-xml"><name>John Smith</name><name>Jane Doe</name></code>
在原始查询中,列别名 'data()' 在尝试创建无效 XML 标签时会触发错误。为了解决这个问题,相关的子查询隐藏了错误,去除了标签并生成了纯文本。
<code class="language-sql">SELECT Name AS [Data()] FROM Employee FOR XML PATH ('')</code>
最后,REPLACE
将列表中的空格替换为逗号。
改进后的查询:
然而,以下改进后的查询更可取:
<code class="language-sql">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; </code>
此查询使用 STUFF
删除第一个逗号和空格,避免了名称包含空格时的错误。省略列别名可以防止创建 XML 标签。
其他注意事项:
为了转义特殊的 XML 字符,可以使用 .value
与 FOR XML PATH
结合使用:
<code class="language-sql">SELECT E1.deptno, STUFF(( SELECT ', ' + E2.ename FROM emp AS e2 WHERE e1.deptno = e2.DEPTNO FOR XML PATH(''), TYPE ).value('.', 'NVARCHAR(MAX)'), 1, 2, '') FROM EMP AS e1 GROUP BY DEPTNO; </code>
以上是如何使用 FOR XML PATH 在 SQL Server 中创建逗号分隔列表?的详细内容。更多信息请关注PHP中文网其他相关文章!