Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
gäller för:SQL Server
Returnerar sekvensen av elementnoder med xs:ID-värden som matchar värdena för en eller flera av de xs:IDREF-värden som anges i $arg.
Syntax
fn:id($arg as xs:IDREF*) as element()*
Argument
$arg
Ett eller flera xs:IDREF-värden.
Anmärkningar
Resultatet av funktionen är en sekvens av element i XML-instansen, i dokumentordning, som har ett xs:ID-värde som är lika med en eller flera av xs:IDREFs i listan över kandidat xs:IDREFs.
Om xs:IDREF-värdet inte matchar något element returnerar funktionen den tomma sekvensen.
Exempel
Det här avsnittet innehåller XQuery-exempel mot XML-instanser som lagras i olika XML- typkolumner i AdventureWorks2022
-databasen.
A. Hämtar element baserat på IDREF-attributvärdet
I följande exempel används fn:id för att hämta <employee
>-elementen baserat på IDREF-hanterarens attribut. I det här exemplet är manager-attributet ett IDREF-typattribut och eid-attributet är ett ID-typattribut.
För ett specifikt manager-attributvärde hittar funktionen id() det <employee
> element vars ID-typattributvärde matchar indata-IDREF-värdet. Med andra ord returnerar funktionen id() medarbetare för en viss medarbetare.
Det här är vad som händer i exemplet:
En XML-schemasamling skapas.
En skriven xml- variabel skapas med hjälp av XML-schemasamlingen.
Frågan hämtar elementet som har ett ID-attributvärde som refereras av attributet manager IDREF för <
employee
>-elementet.
-- 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
Frågan returnerar "Dave" som värde. Det här tyder på att Dave är Joes manager.
B. Hämtar element baserat på attributet OrderList IDREFS
I följande exempel är attributet OrderList för elementet <Customer
> ett IDREFS-typattribut. Den visar order-ID:t för den specifika kunden. För varje order-ID finns det ett <Order
> element under <Customer
> som anger ordervärdet.
Frågeuttrycket, data(CustOrders:Customers/Customer[1]/@OrderList)[1]
, hämtar det första värdet från IDRES-listan för den första kunden. Det här värdet skickas sedan till funktionen id(). Funktionen hittar sedan det <Order
> element vars OrderID-attributvärde matchar indata till funktionen 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>
Implementeringsbegränsningar
Det här är begränsningarna:
SQL Server stöder inte tvåargumentsversionen av id().
SQL Server kräver att argumenttypen id() vara en undertyp av xs:IDREF*.