Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Gilt für:SQL Server
Gibt die Abfolge von Elementknoten mit xs:ID-Werten zurück, die den Werten einer oder mehrerer der in $arg angegebenen xs:IDREF-Werte entsprechen.
Syntax
fn:id($arg as xs:IDREF*) as element()*
Argumente
$arg
Ein oder mehrere xs:IDREF-Werte.
Hinweise
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.
Bei einem bestimmten Manager-Attributwert findet die Id() -Funktion das <employee
> Element, dessen ID-Typ-Attributwert mit dem Eingabe-IDREF-Wert ü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 typierte XML-Variable wird mithilfe der XML-Schemaauflistung erstellt.
Die Abfrage ruft das Element ab, auf das vom Manager-IDREF-Attribut des <
employee
> Elements verwiesen wird.
-- 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-Typ-Attribut. Es listet die Bestellungs-IDs für diesen bestimmten Kunden auf. Für jede Auftrags-ID gibt es ein <Order
> untergeordnetes Element unter der <Customer
> Angabe des Bestellwerts.
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 findet dann das <Order
> Element, dessen OrderID-Attributwert mit der Eingabe 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 nicht die Zwei-Argument-Version von id().
SQL Server erfordert, dass der Argumenttyp " id()" ein Untertyp von "xs:IDREF*" ist.