Функция id (XQuery)
Возвращает последовательность узлов элемента со значениями xs:ID, совпадающих с одним или несколькими значениями xs:IDREF, представленными в аргументе $arg.
Синтаксис
fn:id($arg as xs:IDREF*) as element()*
Аргументы
- $arg
Одно или несколько значений xs:IDREF.
Замечания
Результатом функции является последовательность элементов в экземпляре XML, в порядке документов, имеющих значение xs:ID, равное одному или нескольким значениям xs:IDREF в списке кандидатов xs:IDREF.
Если значение xs:IDREF не совпадает ни с одним элементом, функция возвращает пустую последовательность.
Примеры
В этом подразделе рассматриваются примеры на языке XQuery, работающие с XML-экземплярами, хранимыми в различных столбцах типа xml в базе данных AdventureWorks. Обзор каждого из этих столбцов см. в разделе Представление типов xml-данных в базе данных AdventureWorks.
A. Получение элементов, основанных на значении атрибута IDREF
В следующем примере используется функция fn:id для получения элементов <employee
>, основанных на атрибуте управляющего IDREF. В данном примере атрибут управляющего является атрибутом типа IDREF, а атрибут eid — атрибутом типа ID.
Для определенного значения атрибута управляющего функция id() находит элемент <employee
>, значение атрибута ID которого совпадает с входным значением IDREF. Другими словами, для указанного служащего функция id() возвращает его управляющего.
Вот что происходит в примере:
- создается коллекция XML-схем;
- типизированная xml-переменная создается при помощи коллекции XML-схем;
- зЗапрос извлекает элемент, имеющий значение атрибута ID, на которое ссылается атрибут manager IDREF элемента <
employee
>.
-- 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». Это значит, что Дэйв является управляющим Джо.
Б. Извлечение элементов, основанных на значении атрибута OrderList IDREFS
В следующем примере атрибут OrderList элемента <Customer
> является атрибутом типа IDREFS. Он перечисляет идентификаторы заказов определенного заказчика. Для каждого идентификатора заказа существует дочерний элемент <Order
> в элементе <Customer
>, предоставляющем значение заказа.
Выражение запроса 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 не поддерживает версию функции id() с двумя аргументами;
- SQL Server требует, чтобы тип аргумента id() был производным от типа xs:IDREF*.
См. также
Справочник
Функции над последовательностями