Share via


RAW モードの使用

RAW モードでは、クエリの結果セットの各行が XML 要素に変換されます。この XML 要素は、汎用識別子 <row> を持つか、必要に応じて要素名が付けられます。既定では、NULL 以外の行セットの各列の値が <row> 要素の属性にマップされます。FOR XML 句に ELEMENTS ディレクティブが追加されると、各列の値が <row> 要素のサブ要素にマップされます。必要に応じて ELEMENTS ディレクティブと共に XSINIL オプションを指定して、xsi:nil="true" の属性を持つ要素に結果セットの NULL 列値をマップできます。

バイナリ データを base64 エンコード形式で返すには、BINARY BASE64 オプションを FOR XML 句に指定する必要があります。RAW モードでは、BINARY BASE64 オプションを指定しないでバイナリ データを取得すると、エラーが発生します。

結果として生成される XML のスキーマを要求できます。XMLDATA オプションを指定すると、インライン XDR スキーマが返されます。XMLSCHEMA オプションを指定すると、インライン XSD スキーマが返されます。スキーマはデータの先頭に示されます。その結果、トップレベルの要素ごとにスキーマの名前空間参照が繰り返されます。

次の例のクエリでは、さまざまなオプションを指定して、どのように FOR XML RAW モードが使用されるかを示します。クエリの多くは、ProductModel テーブルの Instructions 列に格納されている、自転車の製造手順の XML ドキュメントに対して指定されています。XML 命令の詳細については、「AdventureWorks データベースの xml データ型表現」を参照してください。

A. XML での製品モデル情報の取得

次のクエリでは、製品モデル情報が返されます。FOR XML 句に RAW モードを指定しています。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW;
GO

次に、結果の一部を示します。

<row ProductModelID="122" Name="All-Purpose Bike Stand" />

<row ProductModelID="119" Name="Bike Wash" />

ELEMENTS ディレクティブを指定することにより、要素中心の XML を取得できます。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, ELEMENTS;
GO

次に結果セットを示します。

<row>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</row>
<row>
  <ProductModelID>119</ProductModelID>
  <Name>Bike Wash</Name>
</row>

結果を xml 型で取得するために、必要に応じて TYPE ディレクティブを指定できます。TYPE ディレクティブを指定しても、結果の内容は変更されません。結果のデータ型のみが変更されます。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, TYPE ;
GO

B. NULL 列値に対して要素を生成するために、ELEMENTS ディレクティブと共に XSINIL を指定

次のクエリでは、ELEMENTS ディレクティブを指定し、クエリ結果から要素中心の XML を生成します。

USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.Product
FOR XML RAW, ELEMENTS;
GO

次に結果の一部を示します。

<row>
  <ProductID>1</ProductID>
  <Name>Adjustable Race</Name>
</row>
...
<row>
  <ProductID>317</ProductID>
  <Name>LL Crankarm</Name>
  <Color>Black</Color>
</row>

一部の製品では Color 列に NULL 値が含まれるので、その結果の XML では対応する <Color> 要素が生成されません。ELEMENTS と共に XSINIL ディレクティブを追加することにより、結果セット内の Color 列が NULL 値の行も <Color> 要素を生成できます。

USE AdventureWorks;
GO
SELECT ProductID, Name, Color
FROM Production.Product
FOR XML RAW, ELEMENTS XSINIL

次に、結果の一部を示します。

<row xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
  <ProductID>1</ProductID>
  <Name>Adjustable Race</Name>
  <Color xsi:nil="true" />
</row>
...
<row>
  <ProductID>317</ProductID>
  <Name>LL Crankarm</Name>
  <Color>Black</Color>
</row>

C. XMLDATA オプションと XMLSCHEMA オプションを使用した結果のスキーマの要求

次のクエリでは、ドキュメント構造を記述する XML-DATA スキーマが返されます。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLDATA
GO

次に結果セットを示します。

<Schema name="Schema1" xmlns="urn:schemas-microsoft-com:xml-data" 
        xmlns:dt="urn:schemas-microsoft-com:datatypes">
  <ElementType name="row" content="empty" model="closed">
    <AttributeType name="ProductModelID" dt:type="i4" />
    <AttributeType name="Name" dt:type="string" />
    <attribute type="ProductModelID" />
    <attribute type="Name" />
  </ElementType>
</Schema>
<row xmlns="x-schema:#Schema1" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="x-schema:#Schema1" ProductModelID="119" Name="Bike Wash" />
ms175140.note(ja-jp,SQL.90).gifメモ :
<Schema> は、名前空間として宣言されます。異なる複数の FOR XML クエリで複数の XML-Data スキーマを要求するときに、名前空間の競合を避けるために、名前空間識別子 (この例では Schema1) はクエリを実行するたびに変わります。名前空間識別子は、Scheman (n は整数) で構成されます。

XMLSCHEMA オプションを指定することにより、結果の XSD スキーマを要求できます。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA
GO

次に結果セットを示します。

<xsd:schema targetNamespace="urn:schemas-microsoft-com:sql:SqlRowSet1" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="row">
    <xsd:complexType>
      <xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
      <xsd:attribute name="Name" use="required">
        <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
          <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
            <xsd:maxLength value="50" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:schemas-microsoft-com:sql:SqlRowSet1" ProductModelID="119" Name="Bike Wash" />

FOR XML の XMLSCHEMA には、省略可能な引数として対象名前空間 URI を指定できます。これにより、スキーマに指定した対象名前空間が返されます。この対象名前空間はクエリを何回実行しても変わりません。たとえば、上記のクエリを変更した次のクエリには、名前空間 URI である 'urn:example.com' が引数として含まれています。

USE AdventureWorks;
GO
SELECT ProductModelID, Name
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119
FOR XML RAW, XMLSCHEMA ('urn:example.com')
GO

次に結果セットを示します。

<xsd:schema targetNamespace="urn:example.com" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:sqltypes="https://schemas.microsoft.com/sqlserver/2004/sqltypes" elementFormDefault="qualified">
  <xsd:import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes" schemaLocation="https://schemas.microsoft.com/sqlserver/2004/sqltypes/sqltypes.xsd" />
  <xsd:element name="row">
    <xsd:complexType>
      <xsd:attribute name="ProductModelID" type="sqltypes:int" use="required" />
      <xsd:attribute name="Name" use="required">
        <xsd:simpleType sqltypes:sqlTypeAlias="[AdventureWorks].[dbo].[Name]">
          <xsd:restriction base="sqltypes:nvarchar" sqltypes:localeId="1033" sqltypes:sqlCompareOptions="IgnoreCase IgnoreKanaType IgnoreWidth" sqltypes:sqlSortId="52">
            <xsd:maxLength value="50" />
          </xsd:restriction>
        </xsd:simpleType>
      </xsd:attribute>
    </xsd:complexType>
  </xsd:element>
</xsd:schema>
<row xmlns="urn:example.com" ProductModelID="122" Name="All-Purpose Bike Stand" />
<row xmlns="urn:example.com" ProductModelID="119" Name="Bike Wash" />

D. バイナリ データの取得

次のクエリでは、varbinary(max) 型の列に格納された製品の写真が返されます。クエリで BINARY BASE64 オプションが指定されているので、バイナリ データは Base64 エンコード形式で返されます。

USE AdventureWorks
GO
SELECT ProductPhotoID, ThumbNailPhoto
FROM Production.ProductPhoto
WHERE ProductPhotoID=1
FOR XML RAW, BINARY BASE64 ;
GO

次に結果セットを示します。

<row ProductModelID="1" ThumbNailPhoto="base64 encoded binary data"/>

E. <row> 要素の名前変更

結果セットの各行では、RAW モードによって要素 <row> が生成されます。次のクエリに示すように、必要に応じて、RAW モードへの省略可能な引数を指定することにより、この要素に別の名前を指定できます。クエリでは、行セットの行ごとに <ProductModel> 要素が返されます。

SELECT ProductModelID, Name 
FROM Production.ProductModel
WHERE ProductModelID=122
FOR XML RAW ('ProductModel'), ELEMENTS
GO

次に結果を示します。ELEMENTS ディレクティブがクエリに追加されたので、結果は要素中心になります。

<ProductModel>
  <ProductModelID>122</ProductModelID>
  <Name>All-Purpose Bike Stand</Name>
</ProductModel> 

F. FOR XML で生成される XML のルート要素の指定

次のクエリに示すように、FOR XML クエリで ROOT オプションを指定することにより、結果の XML に 1 つのトップレベル要素を要求できます。ROOT ディレクティブに指定した引数で、ルート要素名を指定します。

USE AdventureWorks;
GO
SELECT ProductModelID, Name 
FROM Production.ProductModel
WHERE ProductModelID=122 or ProductModelID=119 or ProductModelID=115
FOR XML RAW, ROOT('MyRoot')
go

次に結果セットを示します。

<MyRoot>
  <row ProductModelID="122" Name="All-Purpose Bike Stand" />
  <row ProductModelID="119" Name="Bike Wash" />
  <row ProductModelID="115" Name="Cable Lock" />
</MyRoot>

G. xml 型の列のクエリ

次のクエリには、xml 型の列が含まれています。クエリでは、xml 型の Instructions 列から、製品モデル ID、名前、および最初の場所での製造手順を取得しています。

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') 
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
GO

結果を次に示します。テーブルには、一部の製品モデルの製造手順だけが格納されます。製造手順は、結果内の <ProductModelData> 要素のサブ要素として返されます。

<ProductModelData ProductModelID="5" Name="HL Mountain Frame" />
<ProductModelData ProductModelID="6" Name="HL Road Frame" />
<ProductModelData ProductModelID="7" Name="HL Touring Frame">
    <MI:step> ... </MI:step>
    <MI:step> ... </MI:step>
 </ProductModelData>

次の SELECT ステートメントで指定されているように、XQuery から返される XML に対して列名をクエリで指定した場合、製造手順は指定した名前の要素でラップされます。

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData')
go

次に結果セットを示します。

<ProductModelData ProductModelID="5" Name="HL Mountain Frame" />
<ProductModelData ProductModelID="6" Name="HL Road Frame" />
<ProductModelData ProductModelID="7" Name="HL Touring Frame">
  <ManuSteps>
    <MI:step ... </MI:step>
    <MI:step ... </MI:step>
  </ManuSteps>
</ProductModelData>

次のクエリでは、ELEMENTS ディレクティブが指定されています。したがって、返される結果は要素中心になります。XSINIL オプションを ELEMENTS ディレクティブと共に指定すると、行セット内の対応する列が NULL であっても、<ManuSteps> 要素が返されます。

USE AdventureWorks;
GO
SELECT ProductModelID, Name,
   Instructions.query('
declare namespace MI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions"
   /MI:root/MI:Location[1]/MI:step
') as ManuSteps
FROM Production.ProductModel
FOR XML RAW ('ProductModelData'), root('MyRoot'), ELEMENTS XSINIL
go

次に結果セットを示します。

<MyRoot xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
   ...
  <ProductModelData>
    <ProductModelID>6</ProductModelID>
    <Name>HL Road Frame</Name>
    <ManuSteps xsi:nil="true" />
  </ProductModelData>
  <ProductModelData>
    <ProductModelID>7</ProductModelID>
    <Name>HL Touring Frame</Name>
    <ManuSteps>
      <MI:step ... </MI:step>
      <MI:step ...</MI:step>
       ...
    </ManuSteps>
  </ProductModelData>
</MyRoot>

H. WITH XMLNAMESPACES を使用した名前空間の追加

例については、「WITH XMLNAMESPACES を使用した名前空間の追加」を参照してください。

参照

関連項目

AUTO モードの使用
EXPLICIT モードの使用
FOR XML を使用した XML の構築

概念

WITH XMLNAMESPACES を使用した名前空間の追加
PATH モードの使用

その他の技術情報

SELECT (Transact-SQL)

ヘルプおよび情報

SQL Server 2005 の参考資料の入手