Partilhar via


Funções em sequências - id

Aplica-se a:SQL Server

Retorna a sequência de nós de elemento com valores xs:ID que correspondem aos valores de um ou mais dos valores xs:IDREF fornecidos em $arg.

Sintaxe

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

Argumentos

$arg
Um ou mais valores xs:IDREF.

Comentários

O resultado da função é uma sequência de elementos na instância XML, na ordem do documento, que tem um valor xs:ID igual a um ou mais dos xs:IDREFs na lista de candidatos xs:IDREFs.

Se o valor xs:IDREF não corresponder a nenhum elemento, a função retornará a sequência vazia.

Exemplos

Este tópico fornece exemplos de XQuery em instâncias XML armazenadas em várias colunas do tipo xml no banco de dados AdventureWorks2025.

Um. Recuperando elementos com base no valor do atributo IDREF

O exemplo a seguir usa fn:id para recuperar os elementos <employee>, com base no atributo IDREF manager. Neste exemplo, o atributo manager é um atributo de tipo IDREF e o atributo eid é um atributo de tipo de ID.

Para um valor de atributo de gerenciador específico, a função de id() localiza o elemento <employee> cujo valor do atributo ID type corresponde ao valor IDREF de entrada. Em outras palavras, para um funcionário específico, a função id() retorna o gerente do funcionário.

É o que acontece no exemplo:

  • Uma coleção de esquema XML é criada.

  • Uma variável de xml digitada é criada usando a coleção de esquema XML.

  • A consulta recupera o elemento que tem um valor de atributo ID referenciado pelo gerenciador de atributo IDREF do 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  

A consulta retorna "Dave" como o valor. Isso indica que Dave é o empresário de Joe.

B. Recuperando elementos com base no valor do atributo IDREFS OrderList

No exemplo a seguir, o atributo OrderList do elemento <Customer> é um atributo de tipo IDREFS. Ele lista as ids de pedido para esse cliente específico. Para cada id de ordem, há um elemento filho de <Order> sob o <Customer> que fornece o valor da ordem.

A expressão de consulta, data(CustOrders:Customers/Customer[1]/@OrderList)[1], recupera o primeiro valor da lista IDRES para o primeiro cliente. Esse valor é então passado para a função id(). Em seguida, a função localiza o elemento <Order> cujo valor do atributo OrderID corresponde à entrada para a função 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>  

Limitações de implementação

Estas são as limitações:

  • O SQL Server não oferece suporte à versão de dois argumentos do id().

  • O SQL Server requer que o tipo de argumento de id() seja um subtipo de xs:IDREF*.

Ver também

funções em sequências