XML 데이터 형식에 대한 FOR XML 지원
적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
FOR XML
쿼리가 SELECT
절에 xml 형식의 열을 지정하는 경우 ELEMENTS
지시문을 지정했는지 여부에 관계없이 열 값이 반환된 XML의 요소로 매핑됩니다. xml 유형의 열에 있는 XML 선언은 직렬화되지 않습니다.
예를 들어 다음 쿼리는 xml 유형의 AdditionalContactInfo
열에서 고객 연락처 정보(예: BusinessEntityID
, FirstName
, LastName
열) 및 전화 번호를 검색합니다.
USE AdventureWorks2022;
GO
SELECT BusinessEntityID,
FirstName,
LastName,
AdditionalContactInfo.query('
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') AS PhoneNumber
FROM Person.Person
WHERE AdditionalContactInfo.query('
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') IS NOT NULL
FOR XML AUTO, TYPE;
쿼리에서 ELEMENTS
지시문을 지정하지 않으므로 열 값은 xml 형식 열에서 검색된 추가 연락처 정보 값을 제외하고 특성으로 반환됩니다. 이러한 값은 요소로 반환됩니다.
다음은 결과의 일부입니다.
<Person.Person BusinessEntityID="291" FirstName="Gustavo" LastName="Achong">
<PhoneNumber>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1112</act:number>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1111</act:number>
</PhoneNumber>
</Person.Person>
<Person.Person BusinessEntityID="293" FirstName="Catherine" LastName="Abel">
<PhoneNumber>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-2222</act:number>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-1234</act:number>
</PhoneNumber>
</Person.Person>
...
XQuery에서 생성된 XML 열의 열 별칭을 지정하는 경우 해당 별칭은 XQuery에서 생성된 XML 주위에 래퍼 요소를 추가하는 데 사용됩니다. 예를 들어 다음 쿼리는 MorePhoneNumbers
를 열 별칭으로 지정합니다.
SELECT BusinessEntityID,
FirstName,
LastName,
AdditionalContactInfo.query('
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') AS PhoneNumber
FROM Person.Person
WHERE AdditionalContactInfo.query('
declare namespace act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') IS NOT NULL
FOR XML AUTO, TYPE;
XQuery에서 반환된 XML은 다음 부분 결과에 표시된 대로 <MorePhoneNumbers>
요소에 래핑됩니다.
<Person.Person BusinessEntityID="291" FirstName="Gustavo" LastName="Achong">
<MorePhoneNumbers>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1112</act:number>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">425-555-1111</act:number>
</MorePhoneNumbers>
</Person.Person>
<Person.Person BusinessEntityID="293" FirstName="Catherine" LastName="Abel">
<MorePhoneNumbers>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-2222</act:number>
<act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">206-555-1234</act:number>
</MorePhoneNumbers>
</Person.Person>
...
쿼리에서 ELEMENTS
지시문을 지정하는 경우, BusinessEntityID
, LastName
및 FirstName
은 결과 XML의 요소로 반환됩니다.
다음 예제에서는 FOR XML
처리 논리가 xml 형식 열의 XML 데이터에서 XML 선언을 직렬화하지 않는 것을 보여 줍니다.
CREATE TABLE t (
i INT,
x XML
);
GO
INSERT INTO t
VALUES (
1,
'<?xml version="1.0" encoding="UTF-8" ?>
<Root SomeID="10" />'
);
SELECT i, x FROM t
FOR XML AUTO;
결과 집합은 다음과 같습니다. 결과에서 XML 선언 <?xml version="1.0" encoding="UTF-8" ?>
은 직렬화되지 않습니다.
<root>
<t i="1">
<x>
<Root SomeID="10" />
</x>
</t>
</root>
사용자 정의 함수에서 XML 반환
FOR XML
쿼리를 사용하여 다음 중 하나를 반환하는 사용자 정의 함수로부터 XML을 반환할 수 있습니다.
단일 xml 유형 열이 포함된 테이블
xml 유형의 인스턴스
예를 들어 다음 사용자 정의 함수는 xml 형식의 단일 열이 있는 테이블을 반환합니다.
USE AdventureWorks2022;
GO
CREATE FUNCTION dbo.MyUDF (@ProudctModelID INT)
RETURNS @T TABLE (ProductDescription XML)
AS
BEGIN
INSERT @T
SELECT CatalogDescription.query('
declare namespace PD="https://www.adventure-works.com/schemas/products/description";
//PD:ProductDescription ')
FROM Production.ProductModel
WHERE ProductModelID = @ProudctModelID
RETURN
END;
사용자 정의 함수를 실행하고 반환된 테이블을 쿼리할 수 있습니다. 이 예제에서는 테이블을 쿼리하여 반환된 XML이 xml 형식 변수에 할당됩니다.
DECLARE @x XML;
SET @x = (SELECT * FROM MyUDF(19));
SELECT @x;
이는 사용자 정의 함수의 또 다른 예입니다. 이 사용자 정의 함수는 xml 형식의 인스턴스를 반환합니다. 이 예제에서 사용자 정의 함수는 스키마 네임스페이스가 지정되어 있으므로 형식화된 XML 인스턴스를 반환합니다.
DROP FUNCTION dbo.MyUDF;
GO
CREATE FUNCTION MyUDF (@ProductModelID INT)
RETURNS XML([Production].[ProductDescriptionSchemaCollection])
AS
BEGIN
DECLARE @x XML
SET @x = (
SELECT CatalogDescription
FROM Production.ProductModel
WHERE ProductModelID = @ProductModelID
);
RETURN @x
END;
사용자 정의 함수에서 반환된 XML은 다음과 같이 xml 형식 변수에 할당할 수 있습니다.
DECLARE @x XML;
SELECT @x = dbo.MyUDF(19);
SELECT @x;
관련 콘텐츠
피드백
https://aka.ms/ContentUserFeedback
출시 예정: 2024년 내내 콘텐츠에 대한 피드백 메커니즘으로 GitHub 문제를 단계적으로 폐지하고 이를 새로운 피드백 시스템으로 바꿀 예정입니다. 자세한 내용은 다음을 참조하세요.다음에 대한 사용자 의견 제출 및 보기