id 関数 (XQuery)
$arg で指定された 1 つ以上の xs:IDREF 値に一致する xs:ID 値を持つ要素ノードのシーケンスを返します。
構文
fn:id($arg as xs:IDREF*) as element()*
引数
- $arg
1 つ以上の xs:IDREF 値。
解説
関数の結果は、XML インスタンス内の要素をドキュメント順に示したシーケンスです。シーケンスを形成する要素の xs:ID 値は、候補となる xs:IDREF のリストに含まれている 1 つ以上の xs:IDREF のいずれかに一致します。
xs:IDREF 値がどの要素とも一致しない場合は、空のシーケンスを返します。
例
このトピックでは、AdventureWorks データベースのさまざまな xml 型の列に格納されている XML インスタンスに対して実行する XQuery の例について説明します。これらの各列の概要については、「AdventureWorks データベースの xml データ型表現」を参照してください。
A. IDREF 属性値に基づいて要素を取得する
次の例では、fn:id を使用し、IDREF マネージャ属性に基づいて <employee
> 要素を取得します。この例では、マネージャ属性は IDREF 型の属性で、eid 属性は ID 型の属性です。
id() 関数では、特定のマネージャ属性値について、ID 型の属性値が入力の IDREF 値に一致する <employee
> 要素が検索されます。つまり、id() 関数は特定の従業員に対してその従業員のマネージャを返します。
この例では次のことが行われます。
- XML スキーマ コレクションが作成されます。
- XML スキーマ コレクションを使用して、型指定された xml 変数が作成されます。
- クエリでは、<
employee
> 要素の manager IDREF 属性によって参照されている ID 属性値の要素が取得されます。
-- If exists, drop the XML schema collection (SC).
-- drop xml schema collection SC
-- go
create xml schema collection SC as
'<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:e="emp" targetNamespace="emp">
<element name="employees" type="e:EmployeesType"/>
<complexType name="EmployeesType">
<sequence>
<element name="employee" type="e:EmployeeType" minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="EmployeeType">
<attribute name="eid" type="ID" />
<attribute name="name" type="string" />
<attribute name="manager" type="IDREF" />
</complexType>
</schema>'
go
declare @x xml(SC)
set @x='<e:employees xmlns:e="emp">
<employee eid="e1" name="Joe" manager="e10" />
<employee eid="e2" name="Bob" manager="e10" />
<employee eid="e10" name="Dave" manager="e10" />
</e:employees>'
select @x.value(' declare namespace e="emp";
(fn:id(e:employees/employee[@name="Joe"]/@manager)/@name)[1]', 'varchar(50)')
Go
クエリは値として "Dave" を返します。これは、Dave が Joe のマネージャであることを示します。
B. OrderList IDREFS 属性値に基づいて要素を取得する
次の例では、<Customer
> 要素の OrderList 属性は IDREFS 型の属性です。この例では特定の顧客に対応する注文 ID がリストされます。注文 ID ごとに、<Customer
> の下に注文の値を提供する <Order
> 子要素が存在します。
クエリ式 data(CustOrders:Customers/Customer[1]/@OrderList)[1]
では、最初の顧客の最初の値が IDRES 一覧から取得されます。次に、この値が id() 関数に渡されます。その後、<Order
> 要素が関数で検索されます。この OrderID 属性値が、id() 関数への入力に一致します。
drop xml schema collection SC
go
create xml schema collection SC as
'<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:Customers="Customers" targetNamespace="Customers">
<element name="Customers" type="Customers:CustomersType"/>
<complexType name="CustomersType">
<sequence>
<element name="Customer" type="Customers:CustomerType" minOccurs="0" maxOccurs="unbounded" />
</sequence>
</complexType>
<complexType name="OrderType">
<sequence minOccurs="0" maxOccurs="unbounded">
<choice>
<element name="OrderValue" type="integer" minOccurs="0" maxOccurs="unbounded"/>
</choice>
</sequence>
<attribute name="OrderID" type="ID" />
</complexType>
<complexType name="CustomerType">
<sequence minOccurs="0" maxOccurs="unbounded">
<choice>
<element name="spouse" type="string" minOccurs="0" maxOccurs="unbounded"/>
<element name="Order" type="Customers:OrderType" minOccurs="0" maxOccurs="unbounded"/>
</choice>
</sequence>
<attribute name="CustomerID" type="string" />
<attribute name="OrderList" type="IDREFS" />
</complexType>
</schema>'
go
declare @x xml(SC)
set @x='<CustOrders:Customers xmlns:CustOrders="Customers">
<Customer CustomerID="C1" OrderList="OrderA OrderB" >
<spouse>Jenny</spouse>
<Order OrderID="OrderA"><OrderValue>11</OrderValue></Order>
<Order OrderID="OrderB"><OrderValue>22</OrderValue></Order>
</Customer>
<Customer CustomerID="C2" OrderList="OrderC OrderD" >
<spouse>John</spouse>
<Order OrderID="OrderC"><OrderValue>33</OrderValue></Order>
<Order OrderID="OrderD"><OrderValue>44</OrderValue></Order>
</Customer>
<Customer CustomerID="C3" OrderList="OrderE OrderF" >
<spouse>Jane</spouse>
<Order OrderID="OrderE"><OrderValue>55</OrderValue></Order>
<Order OrderID="OrderF"><OrderValue>55</OrderValue></Order>
</Customer>
<Customer CustomerID="C4" OrderList="OrderG" >
<spouse>Tim</spouse>
<Order OrderID="OrderG"><OrderValue>66</OrderValue></Order>
</Customer>
<Customer CustomerID="C5" >
</Customer>
<Customer CustomerID="C6" >
</Customer>
<Customer CustomerID="C7" >
</Customer>
</CustOrders:Customers>'
select @x.query('declare namespace CustOrders="Customers";
id(data(CustOrders:Customers/Customer[1]/@OrderList)[1])')
-- result
<Order OrderID="OrderA">
<OrderValue>11</OrderValue>
</Order>
実装の制限事項
制限事項を次に示します。
- SQL Server では、2 つの引数を使用する id() はサポートされません。
- SQL Server は、id() の引数の型に xs:IDREF* のサブタイプを必要とします。