Condividi tramite


Funzioni su sequenze - id

Si applica a: SQL Server

Restituisce la sequenza di nodi di elemento con valori xs:ID corrispondenti ai valori di uno o più valori xs:IDREF forniti 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 XQuery su istanze XML archiviate in varie colonne di tipo xml nel AdventureWorks2022 database.

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

Nell'esempio seguente viene usato fn:id per recuperare gli <employee> elementi, in base all'attributo di gestione IDREF. 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 di gestione, la funzione id() trova l'elemento il cui valore dell'attributo <employee> di tipo ID corrisponde al valore IDREF di input. In altre parole, per un dipendente specifico, la funzione id() restituisce il responsabile dei dipendenti.

Tale caso è illustrato nell'esempio seguente:

  • Viene creata una raccolta di XML Schema.

  • Una variabile xml tipizzata viene creata utilizzando la raccolta di XML Schema.

  • La query recupera l'elemento con un valore di attributo ID a cui fa riferimento l'attributo IDREF di gestione dell'elementoemployee<>.

-- 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 ordine, è presente un <Order> elemento figlio sotto il valore che fornisce il valore dell'ordine <Customer> .

L'espressione di query, data(CustOrders:Customers/Customer[1]/@OrderList)[1], recupera il primo valore dall'elenco IDRES relativo al primo cliente. Questo valore viene quindi passato alla funzione id(). La funzione trova quindi l'elemento <>Orderil cui valore dell'attributo OrderID corrisponde all'input alla 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 di id().SQL Server non supporta la versione a due argomenti di id().

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

Vedi anche

Funzioni nelle sequenze