Microsoft SQL Server
FOR XML PATH
수색…
비고
다른 여러 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