Click here to view and discuss this page in DocCommentXchange. In the future, you will be sent there automatically.

SQL Anywhere 11.0.1 (日本語) » SQL Anywhere サーバ - SQL の使用法 » データベースにおける XML » データベースにおける XML の使用 » クエリ結果を XML として取得する

 

FOR XML AUTO の使用

AUTO モードは、XML 文書内にネストされた要素を生成します。select リスト内で参照される各テーブルは、生成された XML 内で要素として表されます。ネストの順序は、select リスト内でテーブルが参照される順序に基づきます。AUTO モードを指定すると、select リストの各テーブルに対して要素が作成され、そのテーブル内の各カラムは別個の属性となります。

構文
FOR XML AUTO[, ELEMENTS ]
パラメータ

ELEMENTS   このパラメータを指定すると、FOR XML AUTO は、結果における各カラムに対し属性の代わりに XML 要素を生成します。次に例を示します。

SELECT Employees.EmployeeID, Departments.DepartmentName
FROM Employees JOIN Departments
   ON Employees.DepartmentID=Departments.DepartmentID
ORDER BY EmployeeID
FOR XML AUTO, ELEMENTS;

この場合、結果セット内の各カラムは、<Employees> 要素の属性としてではなく、別個の要素として返されています。NULL 値がある場合は、その要素は、生成される XML 文書から省略されます。

<Employees>
   <EmployeeID>102</EmployeeID>
   <Departments>
      <DepartmentName>R &amp; D</DepartmentName>
   </Departments>
</Employees> 
<Employees>
   <EmployeeID>105</EmployeeID>
   <Departments>
      <DepartmentName>R &amp; D</DepartmentName>
   </Departments>
</Employees> 
<Employees>
   <EmployeeID>129</EmployeeID>
   <Departments>
   <DepartmentName>Sales</DepartmentName>
   </Departments>
</Employees>
...
使用法

FOR XML AUTO を使用してクエリを実行すると、BINARY、LONG BINARY、IMAGE、VARBINARY カラムのデータは、自動的に Base64 エンコード・フォーマットで返されます。デフォルトでは、NULL 値は、結果から省略されます。for_xml_null_treatment オプションを EMPTY に設定すると、NULL 値を空の属性として返すことができます。

for_xml_null_treatment オプションについては、for_xml_null_treatment オプション [データベース]を参照してください。

特に指定しないかぎり、データベース・サーバは、テーブルのローを意味のない順序で返します。特定の順序で結果を表示したい場合、または親要素に複数の子を持たせたい場合は、クエリに ORDER BY 句を含めて、すべての子が隣接するようにしてください。ORDER BY 句を指定しないと、結果のネストはオプティマイザが選択するプランによって決まり、必要なネストが得られないことがあります。

FOR XML AUTO は、整形式 XML 文書を返しません。これは、文書に単一のルート・ノードが含まれないためです。<root> 要素が必要な場合は、1 つの方法として、XMLELEMENT 関数を使用して挿入できます。次に例を示します。

SELECT XMLELEMENT( NAME root,
                   (SELECT EmployeeID AS id, GivenName AS name
                   FROM Employees FOR XML AUTO ) );

XMLELEMENT 関数の詳細については、XMLELEMENT 関数 [文字列]を参照してください。

XML 文書内で使用される属性名や要素名は、エイリアスを指定して変更できます。次のクエリは、ID 属性の名前を product_ID に変更します。

SELECT ID AS product_ID
FROM Products
WHERE Color='Black'
FOR XML AUTO;

次の XML が生成されます。

<Products product_ID="302"/>
<Products product_ID="400"/>
<Products product_ID="501"/>
<Products product_ID="700"/>

テーブルの名前をエイリアスに変更することもできます。次のクエリは、テーブルを product_info に名前を変更します。

SELECT ID AS product_ID
FROM Products AS product_info
WHERE Color='Black'
FOR XML AUTO;

次の XML が生成されます。

<product_info product_ID="302"/>
<product_info product_ID="400"/>
<product_info product_ID="501"/>
<product_info product_ID="700"/>

次のクエリは、<employee> 要素と <department> 要素の両方を含む XML を生成します。<employee> 要素 (select リストで最初にリストされたテーブル) は、<department> 要素の親です。

SELECT EmployeeID, DepartmentName
FROM Employees AS employee JOIN Departments AS department
   ON Employees.DepartmentID=Departments.DepartmentID
ORDER BY EmployeeID
FOR XML AUTO;

前述のクエリによって、次の XML が生成されます。

<employee EmployeeID="102">
   <department DepartmentName="R &amp; D"/>
</employee>
<employee EmployeeID="105">
   <department DepartmentName="R &amp; D"/>
</employee>
<employee EmployeeID="129">
   <department DepartmentName="Sales;"/>
</employee>
<employee EmployeeID="148">
   <department DepartmentName="Finance;"/>
</employee>
...

次のように、select リスト内でカラムの順序を変更するとします。

SELECT DepartmentName, EmployeeID
FROM Employees AS employee JOIN Departments AS department
   ON Employees.DepartmentID=Departments.DepartmentID
ORDER BY 1, 2
FOR XML AUTO;

結果は次のようにネストされます。

<department DepartmentName="Finance">
   <employee EmployeeID="148"/>
   <employee EmployeeID="390"/>
   <employee EmployeeID="586"/>
   ...
</department> 
<Department name="Marketing">
   <employee EmployeeID="184"/>
   <employee EmployeeID="207"/>
   <employee EmployeeID="318"/>
   ...
</department>
...

ここでも、クエリによって生成された XML には、<employee> 要素と <department> 要素の両方が含まれています。しかしこの場合は、<department> 要素が <employee> 要素の親となっています。