FOR XML 쿼리의 TYPE 지시문

적용 대상:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance

XML(Transact-SQL) 데이터 형식에 대한 SQL Server 지원을 사용하면 선택적으로 TYPE 지시문을 지정하여 FOR XML 쿼리의 결과를 xml반환하도록 요청할 수 있습니다. 이렇게 하면 서버에서 FOR XML 쿼리의 결과를 처리할 수 있습니다. 예를 들어 이 결과에 대해 XQuery 쿼리를 지정하거나 xml 유형 변수에 결과를 할당하거나 중첩 FOR XML 쿼리를 쓸 수 있습니다.

참고 항목

SQL Server는 TYPE 지시문을 사용하는 FOR XML 쿼리 또는 XML 데이터 형식을 사용하여 SQL 테이블 열 및 출력 매개 변수에서 XML 인스턴스 데이터 값을 반환하는 등 다양한 서버 구문의 결과로 xml 데이터 형식 인스턴스 데이터를 클라이언트에 반환합니다. 클라이언트 애플리케이션 코드에서 ADO.NET 공급자는 이 xml 데이터 형식 정보를 서버에서 이진 인코딩으로 보내도록 요청합니다. 그러나 TYPE 지시어 없이 FOR XML을 사용하면 XML 데이터가 문자열 유형으로 반환됩니다. 어떤 경우든 클라이언트 공급자는 항상 두 형식의 XML을 처리할 수 있습니다. TYPE 지시어가 없는 최상위 FOR XML은 커서와 함께 사용할 수 없습니다.

다음 예에서는 TYPE 지시어를 FOR XML 쿼리와 함께 사용하는 방법을 보여 줍니다.

FOR XML 쿼리 결과를 xml 형식으로 검색

다음 쿼리는 테이블에서 고객 연락처 정보를 검색합니다 Contacts . 지시문이 TYPE 지정되므로 FOR XML결과가 xml 형식으로 반환됩니다.

USE AdventureWorks2022;
Go
SELECT BusinessEntityID, FirstName, LastName
FROM Person.Person
ORDER BY BusinessEntityID
FOR XML AUTO, TYPE;

다음은 부분 결과입니다.

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez"/>
<Person.Person BusinessEntityID="2" FirstName="Terri" LastName="Duffy"/>
...

XML 형식 변수에 FOR XML 쿼리 결과 할당

다음 예제에서는 FOR XML 결과가 xml 형식 변수@x할당됩니다. 쿼리는 xmlTYPE에서 AdditionalContactInfo 연락처 정보(예: BusinessEntityID, FirstNameLastName추가 전화 번호)를 검색합니다. 절은 FOR XML 지시문을 지정 TYPE 하기 때문에 XML이 xml 형식으로 반환되고 변수에 할당됩니다.

USE AdventureWorks2022;
GO
DECLARE @x xml;
SET @x = (
   SELECT BusinessEntityID,
          FirstName,
          LastName,
          AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
              //act:telephoneNumber/act:number') as MorePhoneNumbers
   FROM Person.Person
   FOR XML AUTO, TYPE);
SELECT @x;
GO

FOR XML 쿼리의 결과 쿼리

FOR XML 쿼리는 XML을 반환합니다. 따라서 FOR XML 쿼리에서 반환된 XML 결과에 xml 형식 메서드(예: query()value())를 적용할 수 있습니다.

다음 쿼리 query() 에서는 xml 데이터 형식의 메서드를 사용하여 쿼리 결과를 쿼리합니다FOR XML. 자세한 내용은 query() 메서드(xml 데이터 형식)를 참조하세요.

USE AdventureWorks2022;
GO
SELECT (SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
DECLARE namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
DECLARE namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
//act:telephoneNumber/act:number
') AS PhoneNumbers
FROM Person.Person
FOR XML AUTO, TYPE).query('/Person.Person[1]');

내부 SELECT ... FOR XML 쿼리는 외부 SELECT 에서 메서드를 xml 형식에 적용하는 xml 형식 결과를 반환합니다query(). TYPE 지정된 지시문을 확인합니다.

결과는 다음과 같습니다.

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez">
  <PhoneNumbers>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">111-111-1111</act:number>
    <act:number xmlns:act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">112-111-1111</act:number>
  </PhoneNumbers>
</Person.Person>

다음 쿼리 value() 에서는 xml 데이터 형식의 메서드를 사용하여 쿼리에서 반환된 XML 결과에서 값을 검색합니다SELECT...FOR XML. 자세한 내용은 value() 메서드(xml 데이터 형식)를 참조하세요.

USE AdventureWorks2022;
GO
DECLARE @FirstPhoneFromAdditionalContactInfo varchar(40);
SELECT @FirstPhoneFromAdditionalContactInfo =
( SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('
declare namespace aci="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
   //act:telephoneNumber/act:number
   ') AS PhoneNumbers
   FROM Person.Person Contact
   FOR XML AUTO, TYPE).value('
declare namespace act="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes";
  /Contact[@BusinessEntityID="1"][1]/PhoneNumbers[1]/act:number[1]', 'varchar(40)'
);
SELECT @FirstPhoneFromAdditionalContactInfo;

메서드의 value() XQuery 경로 식은 고객 연락처 BusinessEntityID1의 첫 번째 전화 번호를 검색합니다.

참고 항목

TYPE 지시문을 지정하지 않으면 FOR XML 쿼리 결과가 nvarchar(max) 형식으로 반환됩니다.

INSERT, UPDATE 및 DELETE에서 FOR XML 쿼리 결과 사용(Transact-SQL DML)

다음 예제에서는 FOR XML 쿼리를 DML(데이터 조작 언어) 문에서 사용하는 방법을 보여 줍니다. 예제 FOR XML 에서 xml 형식의 인스턴스를 반환합니다. 이 문은 INSERT 이 XML을 테이블에 삽입합니다.

CREATE TABLE T1(intCol int, XmlCol xml);
GO
INSERT INTO T1
VALUES(1, '<Root><ProductDescription ProductModelID="1" /></Root>');
GO

CREATE TABLE T2(XmlCol xml)
GO
INSERT INTO T2(XmlCol)
SELECT (SELECT XmlCol.query('/Root')
        FROM T1
        FOR XML AUTO,TYPE);
GO

참고 항목