首页 > 数据库 > mysql教程 > 如何使用 FOR XML PATH 在 SQL Server 中创建逗号分隔列表?

如何使用 FOR XML PATH 在 SQL Server 中创建逗号分隔列表?

DDD
发布: 2025-01-18 10:27:10
原创
609 人浏览过

How to Create Comma-Delimited Lists in SQL Server Using FOR XML PATH?

使用 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 字符,可以使用 .valueFOR 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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板