回答

收藏

如何创建一个以逗号分隔的列表?SQL Server?

技术问答 技术问答 46 人阅读 | 0 人回复 | 2023-09-13

我已经在Google这个查询是在帮助下编写的,以便从表格中创建定界列表,但我对此查询一无所知。
5 X  O. p! h) O4 H: u谁能解释我发生了什么?; o+ k; B+ p: \' {# {
    SELECT     E1.deptno,    allemp = Replace ((SELECT E2.ename AS 'data()                                  FROM emp AS e 2                                                                                                                                                                                                                                                                                                                                                                                                                                      WHERE e1.deptno = e2.DEPTNO                        FOR xml PATH,,FROM EMP AS e1  GROUP BY DEPTNO;给我结果% R/ t, `/ P9 U. @; q9 P
10  CLARK,KING,MILLER20  SMITH,JONES,SCOTT,ADAMS,FORD30  ALLEN,WARD,MARTIN,BLAKE,TURNER,JAMES                ; `9 O, I5 ?: ^# e  t
    解决方案:                                                               
/ M) G1 ]! Y2 B: {( v- }- P                                                                最简单的解释方法是检查它FOR XML PATH实际XML的工作方式。想象一个简单的表Employee:
3 s9 j; O# W& V* k$ D: AEmployeeID      Name                                                                                                                                                                                                                              John Smith2                                                                                                                                                                                                                                                                     Jane Doe你可以用8 y2 J, q: N# r6 w  h
SELECT  EmployeeID,NameFROM    emp.EmployeeFOR XML PATH ('Employee')这将创建XML,如下所示) s9 P! I8 w$ D9 ~
    1    John Smith    2    Jane Doe从中PATH删除’Employee’会删除外部xml所以查询:
8 c# P5 H; J7 f0 E+ l' Z' USELECT  NameFROM    EmployeeFOR XML PATH ('')将创建
, a$ ~" y% [! t3 L5 W                John Smith    Jane Doe然后,您执行的操作并不理想,列出 data()会导致sql错误,因为它试图创建非法标签xml因此,标签会产生以下错误:
$ o% w3 ^5 j# J! r& D6 Z9 z5 r列名“ Data()”包含FOR XML要求的无效XML标识符;’(’(0x0028)是第一个第一个字符。
7 ^7 g2 J, V! b) e& ]: S相关子查询隐藏了这个错误,只生成没有标签的错误XML:
+ D  b' V# `5 Z5 T% B3 kSELECT  Name AS [Data()]FROM    EmployeeFOR XML PATH ('')创造" @* l6 y  A. O, C; ~# K
John Smith Jane Doe然后,用逗号代替空间很容易解释…
9 C# R2 y2 h) b2 _. L6 P- n  F+ _如果我是你,我会稍微修改一下查询:' U) B, k6 r  N& Z* O1 l" B. N' f
SELECT  E1.deptno,        STUFF(( SELECT  ,  E2.ename                 FROM    emp AS e2                                                                                                                                                                                                                                                                               WHERE   e1.deptno = e2.DEPTNO                 FOR XML PATH一、二、二、二FROM    EMP AS e1 GROUP BY DEPTNO;不列别名意味着不会创建xml标记,在select在查询中添加逗号意味着任何带有空格的名称都不会造成错误,STUFF删除第一个逗号和空格。
, T$ Y' y/ W1 |8 V附录# A: E3 u$ t# i8 o- ?3 P8 W
详细说明KM评论中提到的内容似乎越来越多,转义XML正确字符的正确方法是使用字符.value以下方法:
3 W; H$ h" V+ l3 jSELECT  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;
分享到:
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则