Funktionen für Sequenzen – id
Gilt für:SQL Server
Gibt die Sequenz von Elementknoten mit xs:ID-Werten zurück, die den Werten eines oder mehrerer xs:IDREF-Werte entsprechen, die in $arg angegeben werden.
Syntax
fn:id($arg as xs:IDREF*) as element()*
Argumente
$arg
Ein oder mehrere xs:IDREF-Werte.
Bemerkungen
Das Ergebnis der Funktion ist eine Sequenz von Elementen in der XML-Instanz in der Dokumentreihenfolge, die einen xs:ID-Wert gleich einem oder mehreren xs:IDREF-Werten in der Liste der xs:IDREF-Kandidaten besitzt.
Wenn der xs:IDREF-Wert keinem Element entspricht, gibt die Funktion die leere Sequenz zurück.
Beispiele
Dieses Thema enthält XQuery-Beispiele für XML-Instanzen, die in verschiedenen Xml-Typspalten in der AdventureWorks2022
Datenbank gespeichert sind.
A. Abrufen von Elementen anhand des Werts des IDREF-Attributs
Im folgenden Beispiel wird fn:id verwendet, um die <employee
> Elemente basierend auf dem IDREF-Manager-Attribut abzurufen. In diesem Beispiel ist das Manager-Attribut ein Attribut vom Typ IDREF, und das eid-Attribut ist ein Attribut vom Typ ID.
Für einen bestimmten Manager-Attributwert findet die id()- Funktion das <employee
> Element, dessen ID-Typ-Attributwert mit dem IDREF-Eingabewert übereinstimmt. Anders ausgedrückt: Für einen bestimmten Mitarbeiter gibt die id()- Funktion den Mitarbeitermanager zurück.
Im Beispiel geschieht Folgendes:
Es wird eine XML-Schemaauflistung erstellt.
Eine typisierte XML-Variable wird mithilfe der XML-Schemaauflistung erstellt.
Die Abfrage ruft das Element ab, das über einen ID-Attributwert verfügt, auf den das manager IDREF-Attribut des <
employee
> Elements verweist.
-- 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
Die Abfrage gibt "Dave" als Wert zurück. Dies gibt an, dass Dave Joes Manager ist.
B. Abrufen von Elementen anhand des Werts des IDREFS-Attributs von OrderList
Im folgenden Beispiel ist das OrderList-Attribut des <Customer
> Elements ein IDREFS-Typattribute. Es listet die Bestellungs-IDs für diesen bestimmten Kunden auf. Für jede Auftrags-ID gibt es ein untergeordnetes <Order
> Element unter der , die <Customer
> den Bestellwert bereitstellt.
Der Abfrageausdruck data(CustOrders:Customers/Customer[1]/@OrderList)[1]
ruft den ersten Wert aus der IDRES-Liste für den ersten Kunden ab. Dieser Wert wird dann an die id()- Funktion übergeben. Die Funktion sucht dann nach dem <Order
> Element, dessen OrderID-Attributwert der Eingabe mit der id()- Funktion übereinstimmt.
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>
Implementierungseinschränkungen
Die folgenden Einschränkungen sind zu beachten:
SQL Server unterstützt die Version von id() mit zwei Argumenten nicht.
SQL Server erfordert, dass der Argumenttyp von id() ein Untertyp von xs:IDREF* ist.