適用対象:SQL Server
Azure SQL Database
Azure SQL Managed Instance
Microsoft Fabric の SQL データベース
xml (Transact-SQL) データ型のサポートSQL Server、必要に応じて、 ディレクティブを指定して FOR XML クエリの結果を TYPE として返すように要求できます。 これにより、サーバーで FOR XML クエリの結果を処理できるようになります。 たとえば、その結果に対して XQuery を指定したり、結果を xml 型の変数に割り当てたり、 入れ子になった FOR XML クエリを記述したりできます。
注
SQL Serverは、 ディレクティブをTYPE使用する FOR XML クエリや、SQL テーブルの列と出力パラメーターから XML インスタンス データ値を返すために xml データ型を使用するなど、さまざまなサーバーコンストラクトの結果として xml データ型インスタンス データをクライアントに返します。 クライアント アプリケーション コードでは、ADO.NET プロバイダーが、この xml データ型の情報をサーバーからバイナリ エンコードで送信するように要求します。 ただし、 TYPE ディレクティブなしで FOR XML を使用している場合、XML データは文字列型として返されます。 どんな場合でも、クライアント プロバイダーは常にいずれかの形式の XML を処理できます。 TYPE ディレクティブのない最上位 FOR XML は、カーソルと共に使用できないことに注意してください。
例
次の例は、FOR XML クエリで TYPE ディレクティブを使用する方法を示しています。
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"/>
...
FOR XML クエリ結果の xml 型の変数への代入
次の例では、FOR XML の結果が xml 型の変数 @xに代入されます。 このクエリでは、 BusinessEntityIDxml FirstNameの 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() 型のメソッドを適用できます。
次のクエリでは、 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 クエリにより xml 型の結果が返され、外側の SELECT によりその query() 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>
次のクエリでは、 value() xml データ型の メソッドを使用して、 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 パス式により、 BusinessEntityID が 1の顧客の連絡先から 1 つ目の電話番号が取得されます。
注
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