Share via


Função id (XQuery)

Retorna a seqüência de nós do elemento com valores xs:ID correspondentes 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 seqüê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 xs:IDREFs candidatos.

Se o valor xs:IDREF não corresponder a qualquer elemento, a função retornará a seqüê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 AdventureWorks. Para obter uma visão geral de cada uma dessas colunas, consulte Representação de tipo de dados xml no banco de dados do AdventureWorks.

A. Recuperação de elementos com base no valor do atributo IDREF

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

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

Isso é o que ocorre no exemplo:

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

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

  • A consulta recupera o elemento com um valor de atributo ID consultado pelo atributo IDREF gerente 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 gerente de Joe.

B. Recuperação de elementos com base no valor do atributo IDREFS OrderList

No exemplo a seguir, o atributo OrderList do elemento <Customer> é um atributo do tipo IDREFS. Ele relaciona os ids de ordem desse cliente específico. Para cada id de ordem, há um filho do elemento <Order> em <Customer> fornecendo o valor de 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 é passado então à função id(). A função então localiza o elemento <Order> cujo valor de atributo OrderID corresponde à entrada na 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 de id().

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

Consulte também

Referência