Udostępnij za pośrednictwem


Funkcje w sekwencjach — id

Dotyczy:programu SQL Server

Zwraca sekwencję węzłów elementów z wartościami xs:ID, które odpowiadają wartościom co najmniej jednej wartości xs:IDREF podanej w $arg.

Składnia

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

Argumenty

$arg
Co najmniej jedna wartość xs:IDREF.

Uwagi

Wynikiem funkcji jest sekwencja elementów w wystąpieniu XML w kolejności dokumentu, która ma wartość xs:ID równą co najmniej jednemu xs:IDREFs na liście kandydatów xs:IDREFs.

Jeśli wartość xs:IDREF nie jest zgodna z żadnym elementem, funkcja zwraca pustą sekwencję.

Przykłady

W tym temacie przedstawiono przykłady zapytania XQuery dla wystąpień XML przechowywanych w różnych kolumnach xml typu w bazie danych AdventureWorks2022.

A. Pobieranie elementów na podstawie wartości atrybutu IDREF

W poniższym przykładzie użyto nazwy fn:id do pobrania elementów <employee> na podstawie atrybutu menedżera IDREF. W tym przykładzie atrybut menedżera jest atrybutem typu IDREF, a atrybut eid jest atrybutem typu identyfikatora.

W przypadku określonej wartości atrybutu menedżera funkcja id() znajduje element <employee>, którego wartość atrybutu typu identyfikatora pasuje do wartości wejściowej IDREF. Innymi słowy, dla określonego pracownika funkcja id() zwraca menedżera pracowników.

Dzieje się tak w przykładzie:

  • Zostanie utworzona kolekcja schematów XML.

  • Typowana zmienna xml jest tworzona przy użyciu kolekcji schematów XML.

  • Zapytanie pobiera element, który ma wartość atrybutu ID, do którego odwołuje się menedżer IDREF atrybutu <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  

Zapytanie zwraca wartość "Dave". Oznacza to, że Dave jest menedżerem Joe.

B. Pobieranie elementów na podstawie wartości atrybutu OrderList IDREFS

W poniższym przykładzie atrybut OrderList elementu <Customer> jest atrybutem typu IDREFS. Zawiera on listę identyfikatorów zamówień dla tego konkretnego klienta. Dla każdego identyfikatora zamówienia istnieje element <Order> podrzędny w <Customer> podając wartość zamówienia.

Wyrażenie zapytania, data(CustOrders:Customers/Customer[1]/@OrderList)[1], pobiera pierwszą wartość z listy IDRES dla pierwszego klienta. Ta wartość jest następnie przekazywana do funkcji id(). Następnie funkcja znajduje element <Order>, którego wartość atrybutu OrderID pasuje do danych wejściowych funkcji 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>  

Ograniczenia implementacji

Są to ograniczenia:

  • Program SQL Server nie obsługuje wersji dwóch argumentów id().

  • Program SQL Server wymaga, aby typ argumentu id() był podtypem xs:IDREF*.

Zobacz też

funkcje w sekwencjach