Fonction id (XQuery)

Renvoie la séquence de nœuds d'éléments dont les valeurs xs:ID correspondent à celles de l'une ou de plusieurs des valeurs xs:IDREF fournies dans $arg.

Syntaxe

fn:id($arg as xs:IDREF*) as element()*

Arguments

  • $arg
    Une ou plusieurs valeurs xs:IDREF.

Notes

Le résultat de la fonction est une séquence d'éléments de l'instance XML, dans l'ordre du document, qui ont une valeur xs:ID égale à une ou plusieurs des valeurs xs:IDREF de la liste des candidats xs:IDREF.

Si la valeur xs:IDREF ne correspond à aucun élément, la fonction renvoie la séquence vide.

Exemples

Cette rubrique propose des exemples de XQuery relatifs à des instances XML stockées dans différentes colonnes de type xml tirées de la base de données AdventureWorks2012 .

A.Récupération des éléments en fonction de la valeur de l'attribut IDREF

L'exemple suivant utilise la fonction fn:id pour récupérer les éléments <employee>, en fonction de l'attribut IDREF manager. Dans cet exemple, l'attribut manager est de type IDREF et l'attribut eid est de type ID.

Pour une valeur spécifique de l'attribut manager, la fonction id() recherche l'élément <employee> dont la valeur de l'attribut de type ID correspondant à la valeur IDREF en entrée. Autrement dit, la fonction id() renvoie le supérieur hiérarchique de chaque employé.

Voici ce qui se passe dans l'exemple :

  • Une collection de schémas XML est créée.

  • Une variable typée xml est créée à l'aide de la collection de schémas XML.

  • La requête récupère l'élément qui a une valeur d'attribut ID référencée par l'attribut IDREF manager de l'élément <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

La requête renvoie la valeur « Dave », ce qui indique que Dave est le supérieur hiérarchique de Joe.

B.Récupération des éléments en fonction de la valeur de l'attribut IDREFS OrderList

Dans l'exemple suivant, l'attribut OrderList de l'élément <Customer> est un attribut de type IDREFS. Il répertorie les ID de commande se rapportant à un client particulier. Pour chaque ID de commande, il existe un enfant de l'élément <Order> sous l'élément <Customer> fournissant la valeur de la commande.

L'expression de la requête, data(CustOrders:Customers/Customer[1]/@OrderList)[1], récupère la première valeur de la liste IDREFS pour le premier client. Cette valeur est ensuite transmise à la fonction id(), qui recherche ensuite l'élément <Order> dont la valeur de l'attribut OrderID correspond à la valeur d'entrée de la fonction 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>

Limites de la mise en œuvre

Les limites sont les suivantes :

  • SQL Server ne prend pas en charge la version à deux arguments de id().

  • SQL Server exige que le type d'argument de id() soit un sous-type de xs:IDREF*.

Voir aussi

Référence

Fonctions sur les séquences