序列的相關函式 - id
適用於:SQL Server
傳回具有 xs:ID 值的項目節點序列,這些值符合$arg中提供之一或多個 xs:IDREF 值的值。
語法
fn:id($arg as xs:IDREF*) as element()*
引數
$arg
一或多個 xs:IDREF 值。
備註
函式的結果是 XML 實例中的元素序列,依文件順序,其 xs:ID 值等於候選 xs:IDREFs 清單中的一或多個 xs:IDREF。
如果 xs:IDREF 值不符合任何專案,函式會傳回空序列。
範例
本主題針對儲存在資料庫中各種 xml 類型數據行中的 AdventureWorks2022
XML 實例,提供 XQuery 範例。
A. 根據IDREF屬性值擷取元素
下列範例會使用 fn:id,根據 IDREF 管理員屬性擷取 <employee
> 元素。 在此範例中,manager 屬性是IDREF類型屬性,而 eid 屬性是ID類型屬性。
針對特定的管理員屬性值, id() 函式會 <employee
> 尋找標識碼類型屬性值符合輸入 IDREF 值的元素。 換句話說,對於特定員工, id() 函式會傳回員工經理。
這是範例中會發生的情況:
會建立 XML 架構集合。
具類型的 xml 變數是使用 XML 架構集合所建立。
查詢會擷取具有元素之管理員IDREF屬性所參考之標識碼屬性值的專案。><
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
查詢會傳回 「Dave」 作為值。 這表明戴夫是喬的經理。
B. 根據 OrderList IDREFS 屬性值擷取元素
在下列範例中,元素的 <Customer
> OrderList 屬性是 IDREFS 類型屬性。 它會列出該特定客戶的訂單標識碼。 針對每個訂單標識碼,在提供訂單值下>Customer
<會有一個<Order
>元素子系。
查詢表達式 data(CustOrders:Customers/Customer[1]/@OrderList)[1]
會從第一個客戶的 [美德] 列表中擷取第一個值。 此值接著會傳遞至 id() 函式。 然後,函式會<Order
>尋找 OrderID 屬性值符合 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>
實作限制
以下是限制:
SQL Server 不支援 id() 的雙自變數版本。
SQL Server 需要 id() 的自變數類型為 xs:IDREF*的子類型。