Fonctions sur les séquences : id
S’applique à :SQL Server
Retourne la séquence de nœuds d’éléments avec des valeurs xs:ID qui correspondent aux valeurs d’une ou 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.
Remarques
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 fournit des exemples XQuery par rapport aux instances XML stockées dans différentes colonnes de type XML de la AdventureWorks2022
base de données.
R. Récupération des éléments en fonction de la valeur de l'attribut IDREF
L’exemple suivant utilise fn:id pour récupérer les <employee
> éléments, en fonction de l’attribut du gestionnaire IDREF. Dans cet exemple, l'attribut manager est de type IDREF et l'attribut eid est de type ID.
Pour une valeur d’attribut manager spécifique, la fonction id() recherche l’élément dont la <employee
> valeur d’attribut de type d’ID correspond à la valeur IDREF d’entrée. En d’autres termes, pour un employé spécifique, la fonction id() retourne le gestionnaire de l’employé.
Voici ce qui se passe dans l'exemple :
Une collection de schémas XML est créée.
Une variable xml typée 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 du gestionnaire 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 <Order
> élément enfant sous la <Customer
> 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 passée à la fonction id(). La fonction recherche ensuite l’élément dont la <Order
> valeur d’attribut OrderID correspond à l’entrée à 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 mise en œuvre
Les limitations suivantes s'appliquent :
SQL Server ne prend pas en charge la version à deux arguments de id().
SQL Server nécessite que le type d’argument id() soit un sous-type de xs:IDREF*.