다음을 통해 공유


FOR XML 쿼리의 TYPE 지시문

적용 대상: SQL Server Azure SQL 데이터베이스 Azure SQL Managed Instance

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

참고 항목

SQL Server에서는 TYPE 지시어를 사용하거나 xml 데이터 형식을 사용하여 SQL 테이블 열과 출력 매개 변수에서 XML 인스턴스 데이터 값을 반환하는 FOR 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에 할당됩니다. 쿼리는 xmlBusinessEntityIDFirstName 열에서 연락처 정보(예: LastName, AdditionalContactInfo, TYPE 및 추가 전화 번호)를 검색합니다. 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 결과(예: query()value())에 xml 형식 메서드를 적용할 수 있습니다.

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

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에서 query() 메서드를 xml 형식에 적용하는 xml 형식 결과를 반환합니다. 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>

다음 쿼리에서는 xml 데이터 형식의 value() 메서드를 사용하여 SELECT...FOR XML 쿼리에서 반환된 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 XMLxml 형식의 인스턴스를 반환합니다. 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

참고 항목