FOR XML クエリの TYPE ディレクティブTYPE Directive in FOR XML Queries

適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database適用対象:Applies to: はいSQL ServerSQL Server (サポートされているすべてのバージョン) yesSQL ServerSQL Server (all supported versions) はいAzure SQL データベースAzure SQL DatabaseYesAzure SQL データベースAzure SQL Database

SQL ServerSQL Server では xml (Transact-SQL) データ型がサポートされるため、必要に応じて TYPE ディレクティブを指定することにより、FOR XML クエリの結果を xml データ型として返すように要求できます。support for the xml (Transact-SQL) datatype 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 ディレクティブを使用した FOR XML クエリなど、サーバーでのさまざまな構成の結果として、または SQL テーブルの列および出力パラメーターの XML インスタンス データ値を返すために xml データ型が使用された場合に、XML データ型のインスタンス データをクライアントに返します。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

次の例は、FOR XML クエリでの TYPE ディレクトリの使用方法を示しています。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"/>

...

FOR XML クエリ結果の 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="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 クエリの結果のクエリ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.

次のクエリでは、 query() xml データ型の メソッドを使用して、 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. 詳細については、「クエリ() メソッド (xml データ型)」を参照してください。For more information, see query() Method (xml Data Type).

USE AdventureWorks2012;  
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 クエリにより xml 型の結果が返され、外側の SELECT によりその query() 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="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 データ型の メソッドを使用して、 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="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の顧客の連絡先から 1 つ目の電話番号が取得されます。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)

次の例では、FOR XML クエリをデータ操作言語 (DML) ステートメントで使用する方法について説明します。The following example demonstrates how FOR XML queries can be used in Data Manipulation Language (DML) statements. この例では、 FOR XML により xml 型のインスタンスが返されます。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)