Fungsi pada Urutan - id
Berlaku untuk:SQL Server
Mengembalikan urutan simpul elemen dengan nilai xs:ID yang cocok dengan nilai satu atau beberapa nilai xs:IDREF yang disediakan dalam $arg.
Sintaks
fn:id($arg as xs:IDREF*) as element()*
Argumen
$arg
Satu atau beberapa nilai xs:IDREF.
Keterangan
Hasil fungsi adalah urutan elemen dalam instans XML, dalam urutan dokumen, yang memiliki nilai xs:ID yang sama dengan satu atau beberapa xs:IDREFs dalam daftar candidate xs:IDREFs.
Jika nilai xs:IDREF tidak cocok dengan elemen apa pun, fungsi mengembalikan urutan kosong.
Contoh
Topik ini menyediakan contoh XQuery terhadap instans XML yang disimpan di berbagai kolom jenis xml dalam AdventureWorks2022
database.
J. Mengambil elemen berdasarkan nilai atribut IDREF
Contoh berikut menggunakan fn:id untuk mengambil <employee
> elemen, berdasarkan atribut manajer IDREF. Dalam contoh ini, atribut manajer adalah atribut jenis IDREF dan atribut idul adonan adalah atribut jenis ID.
Untuk nilai atribut manajer tertentu, fungsi id() menemukan <employee
> elemen yang nilai atribut jenis ID-nya cocok dengan nilai IDREF input. Dengan kata lain, untuk karyawan tertentu, fungsi id() mengembalikan manajer karyawan.
Inilah yang terjadi dalam contoh:
Koleksi skema XML dibuat.
Variabel xml yang diketik dibuat dengan menggunakan koleksi skema XML.
Kueri mengambil elemen yang memiliki nilai atribut ID yang direferensikan oleh atribut IDREF manajer elemen
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
Kueri mengembalikan "Dave" sebagai nilai. Ini menunjukkan bahwa Dave adalah manajer Joe.
B. Mengambil elemen berdasarkan nilai atribut ORDERList IDREFS
Dalam contoh berikut, atribut OrderList elemen <Customer
> adalah atribut jenis IDREFS. Ini mencantumkan id pesanan untuk pelanggan tertentu tersebut. Untuk setiap id pesanan, ada <Order
> anak elemen di <Customer
> bawah memberikan nilai pesanan.
Ekspresi kueri, data(CustOrders:Customers/Customer[1]/@OrderList)[1]
, mengambil nilai pertama dari daftar IDRES untuk pelanggan pertama. Nilai ini kemudian diteruskan ke fungsi id(). Fungsi kemudian menemukan <Order
> elemen yang nilai atribut OrderID-nya cocok dengan input ke fungsi 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>
Batasan Implementasi
Ini adalah batasannya:
SQL Server tidak mendukung versi dua argumen id().
SQL Server mengharuskan jenis argumen id() menjadi subjenis xs:IDREF*.