집 >데이터 베이스 >MySQL 튜토리얼 >FOR XML PATH를 사용하여 SQL Server에서 쉼표로 구분된 목록을 만드는 방법은 무엇입니까?
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>
원래 쿼리에서는 잘못된 XML 태그를 생성하려고 할 때 열 별칭 'data()'로 인해 오류가 발생했습니다. 이 문제를 해결하기 위해 상관 하위 쿼리는 오류를 숨기고 레이블을 제거하며 일반 텍스트를 생성합니다.
<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 중국어 웹사이트의 기타 관련 기사를 참조하세요!