Share via


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, LastNameFirstName은 결과 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;