FOR XML 쿼리의 TYPE 지시어TYPE Directive in FOR XML Queries

SQL ServerSQL Server는 [xml(Transact-SQL)](../../t-sql/xml/xml-transact-sql.md)을 지원하므로 필요에 따라 TYPE 지시어를 지정하여 FOR XML 쿼리 결과가 xml 데이터 형식으로 반환되도록 요청할 수 있습니다.(../../t-sql/xml/xml-transact-sql.md) enables you to optionally request that the result of a FOR XML query be returned as xml data type by specifying the TYPE directive. 그러면 서버에서 FOR XML 쿼리 결과를 처리할 수 있습니다.This allows you to process the result of a FOR XML query on the server. 예를 들어 이 결과에 대해 XQuery 쿼리를 지정하거나 xml 유형 변수에 결과를 할당하거나 중첩 FOR XML 쿼리를 쓸 수 있습니다.For example, you can specify an XQuery against it, assign the result to an xml type variable, or write Nested FOR XML queries.

참고

SQL ServerSQL Server 에서는 TYPE 지시어를 사용하거나 xml 데이터 형식을 사용하여 SQL 테이블 열과 출력 매개 변수에서 XML 인스턴스 데이터 값을 반환하는 FOR XML 쿼리와 같은 여러 서버 구문의 결과로 XML 데이터 형식 인스턴스 데이터를 클라이언트에 반환합니다. SQL ServerSQL Server returns XML data type instance data to the client as a result of different server-constructs such as FOR XML queries that use the TYPE directive, or where the xml data type is used to return XML instance data values from SQL table columns and output parameters. 클라이언트 응용 프로그램 코드에서 ADO.NET 공급자가 이 XML 데이터 형식 정보를 서버에서 이진 인코딩으로 보내도록 요청합니다.In client application code, the ADO.NET provider requests this XML data type information to be sent in a binary encoding from the server. 그러나 TYPE 지시어 없이 FOR XML을 사용하면 XML 데이터가 문자열 유형으로 반환됩니다.However, if you are using FOR XML without the TYPE directive, the XML data comes back as a string type. 클라이언트 공급자는 항상 두 XML 유형 중 하나를 처리할 수 있습니다.In any case, the client provider will always be able to handle either form of XML. TYPE 지시어가 없는 최상위 FOR XML은 커서와 함께 사용할 수 없습니다.Note that top-level FOR XML without the TYPE directive cannot be used with cursors.

Examples

다음 예에서는 TYPE 지시어를 FOR XML 쿼리와 함께 사용하는 방법을 보여 줍니다.The following examples illustrate the use of the TYPE directive with FOR XML queries.

FOR XML 쿼리 결과를 xml 유형으로 검색Retrieving FOR XML query results as xml type

다음 쿼리에서는 Contacts 테이블에서 고객 연락처 정보를 검색합니다.The following query retrieves customer contact information from the Contacts table. TYPEFOR XML지시어가 지정되어 있으므로 결과는 xml 유형으로 반환됩니다.Because the TYPE directive is specified in FOR XML, the result is returned as xml type.

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

다음은 결과의 일부입니다.This is the partial result:

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

<Person.Person BusinessEntityID="2" FirstName="Terri" LastName="Duffy"/>

...

xml 유형 변수에 FOR XML 쿼리 결과 할당Assigning FOR XML query results to an xml type variable

다음 예에서는 FOR XML 결과가 xml 유형 변수 @x에 할당됩니다.In the following example, a FOR XML result is assigned to an xml type variable, @x. 쿼리는 BusinessEntityIDxml FirstNameLastName열에서 AdditionalContactInfo , ,TYPE및 추가 전화 번호와 같은 연락처 정보를 검색합니다.The query retrieves contact information, such as the BusinessEntityID, FirstName, LastName, and additional telephone numbers, from the AdditionalContactInfo column of xmlTYPE. FOR XML 절은 TYPE 지시어를 지정하므로 XML은 xml 유형으로 반환되며 변수에 할당됩니다.Because the FOR XML clause specifies TYPE directive, the XML is returned as xml type and is assigned to a variable.

USE AdventureWorks2012;  
GO  
DECLARE @x xml;  
SET @x = (  
   SELECT BusinessEntityID,   
          FirstName,   
          LastName,   
          AdditionalContactInfo.query('  
declare namespace aci="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";  
declare namespace act="http://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 쿼리 결과 쿼리Querying results of a FOR XML query

FOR XML 쿼리가 XML을 반환하므로The FOR XML queries return XML. FOR XML 쿼리에서 반환한 XML 결과에 query() , value() 등의 xml유형 메서드를 적용할 수 있습니다.Therefore, you can apply xml type methods, such as query() and value(), to the XML result returned by FOR XML queries.

다음 쿼리에서는 xml 데이터 형식의 query() 메서드를 사용하여 FOR XML 쿼리 결과를 쿼리합니다.In the following query, the query() method of the xml data type is used to query the result of the FOR XML query. 자세한 내용은 query() 메서드(xml 데이터 형식)를 참조하세요.For more information, see query() Method (xml Data Type).

USE AdventureWorks2012;  
GO  
SELECT (SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('  
DECLARE namespace aci="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";  
DECLARE namespace act="http://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 쿼리는 외부 SELECTquery() 메서드를 xml 유형에 적용하는 xml 유형 결과를 반환합니다.The inner SELECT … FOR XML query returns an xml type result to which the outer SELECT applies the query() method to the xml type. 지정된 TYPE 지시어에 유의하십시오.Note the TYPE directive specified.

다음은 결과입니다.This is the result:

<Person.Person BusinessEntityID="1" FirstName="Ken" LastName="Sánchez">

<PhoneNumbers>

<act:number xmlns:act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">111-111-1111</act:number>

<act:number xmlns:act="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactTypes">112-111-1111</act:number>

</PhoneNumbers>

</Person.Person>

다음 쿼리에서는 xml 데이터 형식의 value() 메서드를 사용하여 SELECT…FOR XML 쿼리가 반환한 XML 결과에서 값을 검색합니다.In the following query, the value() method of the xml data type is used to retrieve a value from the XML result returned by the SELECT…FOR XML query. 자세한 내용은 value() 메서드(xml 데이터 형식)를 참조하세요.For more information, see value() Method (xml Data Type).

USE AdventureWorks2012;  
GO  
DECLARE @FirstPhoneFromAdditionalContactInfo varchar(40);  
SELECT @FirstPhoneFromAdditionalContactInfo =   
 ( SELECT BusinessEntityID, FirstName, LastName, AdditionalContactInfo.query('  
declare namespace aci="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ContactInfo";  
declare namespace act="http://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="http://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인 고객 연락처의 첫 번째 전화 번호를 검색합니다.The XQuery path expression in the value() method retrieves the first telephone number of a customer contact whose BusinessEntityID is 1.

참고

TYPE 지시어를 지정하지 않으면 FOR XML 쿼리 결과가 nvarchar(max)형식으로 반환됩니다.If the TYPE directive is not specified, the FOR XML query result is returned as type nvarchar(max).

INSERT, UPDATE 및 DELETE(Transact-SQL DML)에 FOR XML 쿼리 결과 사용Using FOR XML query results in INSERT, UPDATE, and DELETE (Transact-SQL DML)

다음 예에서는 DML(데이터 조작 언어) 문에 FOR XML 쿼리를 사용할 수 있는 방법을 보여 줍니다.The following example demonstrates how FOR XML queries can be used in Data Manipulation Language (DML) statements. 예에서 FOR XMLxml 유형의 인스턴스를 반환합니다.In the example, the FOR XML returns an instance of xml type. INSERT 문은 이 XML을 테이블에 삽입합니다.The INSERT statement inserts this XML into a table.

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  

참고 항목See Also

FOR XML(SQL Server)FOR XML (SQL Server)