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 & D</DepartmentName> </Departments> </Employees> <Employees> <EmployeeID>105</EmployeeID> <Departments> <DepartmentName>R & 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 & D"/> </employee> <employee EmployeeID="105"> <department DepartmentName="R & 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> 要素の親となっています。
Copyright © 2009, iAnywhere Solutions, Inc. - SQL Anywhere 11.0.1 |