본문 바로가기

프로그래밍&IT/SQL Server (MS-SQL)

SQL Server - FOR XML PATH 그리고 STUFF

FOR XML PATH, STUFF 그리고 조합해 보기

FOR XML PATH
  • 쿼리 결과를 XML 형태로 표현.
  • FOR XML PATH ('row element 이름')
  • 만약 'row element 이름'이 없으면 <row>로 감싸진다.
  • 행 구분자 추가해서, 합친 문자로도
SELECT lastname FROM HR.Employees FOR XML PATH

ex) <row><lastname>Cameron</lastname></row><row><lastname>Davis</lastname></row><row><lastname>Doyle</lastname></row><row><lastname>Funk</lastname></row><row><lastname>King</lastname></row><row><lastname>Lew</lastname></row><row><lastname>Mortensen</lastname></row><row><lastname>Peled</lastname></row><row><lastname>Suurs</lastname></row>

 

SELECT lastname FROM HR.Employees FOR XML PATH ('LName');

결과 - <LName>
  <lastname>Cameron</lastname>
</LName>
<LName>
  <lastname>Davis</lastname>
</LName>
<LName>
  <lastname>Doyle</lastname>
</LName>
<LName>
  <lastname>Funk</lastname>
</LName>
<LName>
  <lastname>King</lastname>
</LName>
<LName>
  <lastname>Lew</lastname>
</LName>
<LName>
  <lastname>Mortensen</lastname>
</LName>
<LName>
  <lastname>Peled</lastname>
</LName>
<LName>
  <lastname>Suurs</lastname>
</LName>

 

SELECT '/' + lastname FROM HR.Employees FOR XML PATH ('');

결과 - /Cameron/Davis/Doyle/Funk/King/Lew/Mortensen/Peled/Suurs

 

여기까지 FOR XML PATH의 기본 사용법이고,

아래의 STUFF와 조합을 많이 쓰는듯싶다.

 

STUFF
  • 문자열의 위치와 길이를 지정해 다른 문자로 치환한다.
  • STUFF(문자열, 위치, 길이, 치환할 문자)
SELECT STUFF('a-b-c', 1, 1,'ABC')

결과) 'a-b-c' => 'ABC-b-c' 로 치환

 

이 둘 간에 조합

 

1. 문자열 합치기

위에 합친 문자열을 가지고

 /Cameron/Davis/Doyle/Funk/King/Lew/Mortensen/Peled/Suurs

 

2. 맨 앞의 구분자 제거

SELECT STUFF( 
	(SELECT '/' + lastname FROM HR.Employees FOR XML PATH ('')
), 1, 1, '') AS '결과'
FROM HR.Employees;

 

3. row 수만큼 표현되므로 중복제거로 DISTINCT를 쓴다.

SELECT DISTINCT STUFF( 
	(SELECT '/' + lastname FROM HR.Employees FOR XML PATH ('')
), 1, 1, '') AS '결과'
FROM HR.Employees;

 

 

살짝 복잡한 면도 있는 듯 하지만..