Funzione id (XQuery)

Restituisce la sequenza di nodi elemento con valori xs:ID corrispondenti ai valori di uno o più valori xs:IDREF specificati in $arg.

Sintassi

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

Argomenti

  • $arg
    Uno o più valori xs:IDREF.

Osservazioni

Il risultato della funzione è una sequenza di elementi dell'istanza XML, nell'ordine in cui ricorrono nel documento, con un valore xs:ID uguale a uno o più valori xs:IDREF nell'elenco di valori xs:IDREF candidati.

Se il valore xs:IDREF non corrisponde ad alcun elemento, la funzione restituisce la sequenza vuota.

Esempi

In questo argomento vengono forniti esempi di utilizzo del linguaggio XQuery sulle istanze XML archiviate in diverse colonne di tipo xml t nel database AdventureWorks2008R2. Per una panoramica su ognuna di queste colonne, vedere Rappresentazione del tipo di dati XML nel database AdventureWorks2008R2.

A. Recupero di elementi basati sul valore dell'attributo IDREF

Nell'esempio seguente viene utilizzato fn:id per recuperare gli elementi <employee>, basati sull'attributo IDREF manager. In questo esempio, l'attributo manager è un attributo di tipo IDREF, mentre l'attributo eid è un attributo di tipo ID.

Per un valore specifico dell'attributo manager, la funzione id() individua l'elemento <employee> per il quale il valore dell'attributo di tipo ID corrisponde al valore IDREF di input. In altre parole, per un dipendente specifico, la funzione id() restituisce il relativo responsabile.

Tale caso è illustrato nell'esempio seguente:

  • Viene creata una raccolta di XML Schema.

  • Viene creata una variabile xml tipizzata utilizzando la raccolta di XML Schema.

  • La query recupera l'elemento con un valore dell'attributo ID a cui fa riferimento l'attributo IDREF manager dell'elemento <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 query restituisce il valore "Dave", che indica che Dave è il responsabile di Joe.

B. Recupero di elementi basati sul valore dell'attributo IDREFS OrderList

Nell'esempio seguente, l'attributo OrderList dell'elemento <Customer> è un attributo di tipo IDREFS che elenca gli ID degli ordini del cliente specifico. Per ogni ID di un ordine, è disponibile un elemento figlio <Order> di <Customer> che indica il valore dell'ordine.

L'espressione di query, data(CustOrders:Customers/Customer[1]/@OrderList)[1], recupera il primo valore dall'elenco IDRES relativo al primo cliente. Successivamente, tale valore viene passato alla funzione id(). La funzione trova quindi l'elemento <Order> con il valore dell'attributo OrderID corrispondente all'input della funzione 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>

Limitazioni di implementazione

Limitazioni:

  • SQL Server non supporta la versione a due argomenti della funzione id().

  • SQL Server richiede che il tipo di argomento della funzione id() sia un sottotipo di xs:IDREF*.

Vedere anche

Riferimento