수색…


비고

다른 여러 FOR XML 모드도 있습니다.

  • FOR XML RAW - <row> 하나의 <row> 요소를 만듭니다.
  • FOR XML AUTO - 계층 구조를 자동으로 생성합니다.
  • FOR XML EXPLICIT - FOR XML EXPLICIT 모양을보다 잘 제어 할 수 있지만 FOR XML PATH 보다 더 복잡합니다.

Hello World XML

SELECT 'Hello World' FOR XML PATH('example')
<example>Hello World</example>

네임 스페이스 지정하기

SQL Server 2008
WITH XMLNAMESPACES (
    DEFAULT 'http://www.w3.org/2000/svg',
    'http://www.w3.org/1999/xlink' AS xlink
)
SELECT 
    'example.jpg' AS 'image/@xlink:href',
    '50px' AS 'image/@width',
    '50px' AS 'image/@height'
FOR XML PATH('svg')
<svg xmlns:xlink="http://www.w3.org/1999/xlink" xmlns="http://www.w3.org/2000/svg">
    <image xlink:href="firefox.jpg" width="50px" height="50px"/>
</svg>

XPath 표현식을 사용하여 구조체 지정하기

SELECT
    'XPath example' AS 'head/title',
    'This example demonstrates ' AS 'body/p',
    'https://www.w3.org/TR/xpath/' AS 'body/p/a/@href',
    'XPath expressions' AS 'body/p/a'
FOR XML PATH('html')
<html>
    <head>
        <title>XPath example</title>
    </head>
    <body>
        <p>This example demonstrates <a href="https://www.w3.org/TR/xpath/">XPath expressions</a></p>
    </body>
</html>

FOR XML PATH 에서 이름이없는 열은 텍스트 노드가됩니다. 따라서 NULL 또는 '' 는 빈 텍스트 노드가됩니다. 참고 : AS * 를 사용하여 명명 된 열을 이름이 지정되지 않은 열로 변환 할 수 있습니다.

DECLARE @tempTable TABLE (Ref INT, Des NVARCHAR(100), Qty INT)
INSERT INTO @tempTable VALUES (100001, 'Normal', 1), (100002, 'Foobar', 1), (100003, 'Hello World', 2)

SELECT ROW_NUMBER() OVER (ORDER BY Ref) AS '@NUM',
     'REF' AS 'FLD/@NAME', REF AS 'FLD', '',
     'DES' AS 'FLD/@NAME', DES AS 'FLD', '',
     'QTY' AS 'FLD/@NAME', QTY AS 'FLD'
FROM @tempTable 
FOR XML PATH('LIN'), ROOT('row')
<row>
  <LIN NUM="1">
    <FLD NAME="REF">100001</FLD>
    <FLD NAME="DES">Normal</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="2">
    <FLD NAME="REF">100002</FLD>
    <FLD NAME="DES">Foobar</FLD>
    <FLD NAME="QTY">1</FLD>
  </LIN>
  <LIN NUM="3">
    <FLD NAME="REF">100003</FLD>
    <FLD NAME="DES">Hello World</FLD>
    <FLD NAME="QTY">2</FLD>
  </LIN>
</row>

(빈) 텍스트 노드를 사용하면 이전 출력 노드를 다음 노드와 분리하여 SQL Server가 다음 열의 새 요소를 시작할 수 있습니다. 그렇지 않으면 속성이 "현재"요소라고 생각되는 부분에 이미 존재할 때 혼란스러워집니다.

예를 들어 SELECT 문에서 요소와 특성 사이에 빈 문자열이 없으면 SQL Server에 오류가 발생합니다.

특성 중심 열 'FLD / @ NAME'은 FOR XML PATH의 XML 계층 구조에 특성 중심이 아닌 형제 항목 뒤에 올 수 없습니다.

또한이 예제는 ROOT('row') 지정된 row 라는 루트 요소에 XML을 래핑했습니다.

FOR XML PATH를 사용하여 값 연결

FOR XML PATH 는 값을 문자열로 연결하는 데 사용할 수 있습니다. 아래 예제에서는 값을 CSV 문자열로 연결합니다.

DECLARE @DataSource TABLE
(
    [rowID] TINYINT
   ,[FirstName] NVARCHAR(32)
);

INSERT INTO @DataSource ([rowID], [FirstName])
VALUES (1, 'Alex')
      ,(2, 'Peter')
      ,(3, 'Alexsandyr')
      ,(4, 'George');

SELECT STUFF
(
    (
        SELECT ',' + [FirstName]
        FROM @DataSource
        ORDER BY [rowID] DESC
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,1
    ,''
);

몇 가지 중요한 메모 :

  • ORDER BY 절을 사용하여 선호하는 방식으로 값을 정렬 할 수 있습니다.
  • 더 긴 값이 연결 구분 기호로 사용되면 STUFF 함수 매개 변수도 변경해야합니다.
SELECT STUFF
(
    (
        SELECT '---' + [FirstName]
        FROM @DataSource
        ORDER BY [rowID] DESC
        FOR XML PATH(''), TYPE
    ).value('.', 'NVARCHAR(MAX)')
    ,1
    ,3 -- the "3" could also be represented as: LEN('---') for clarity
    ,''
);
  • TYPE 옵션과 .value 함수가 사용되면 연결은 NVARCHAR(MAX) 문자열과 함께 작동합니다.


Modified text is an extract of the original Stack Overflow Documentation
아래 라이선스 CC BY-SA 3.0
와 제휴하지 않음 Stack Overflow