分享方式:


序列的相關函式 - id

適用於:SQL Server

傳回具有 xs:ID 值的專案節點序列,這些值符合$arg 提供之一或多個 xs:IDRE光圈值的值。

語法

  
fn:id($arg as xs:IDREF*) as element()*  

引數

$arg
一或多個 xs:IDRE光圈值。

備註

函式的結果是 XML 實例中的元素序列,依檔順序,其 xs:ID 值等於候選 xs:IDREFs 清單中的一或多個 xs:IDREF。

如果 xs:IDRE光圈值不符合任何專案,函式會傳回空序列。

範例

本主題針對儲存在資料庫中各種 xml 類型資料行中的 AdventureWorks2022 XML 實例,提供 XQuery 範例。

A. 根據 IDREF 屬性值擷取元素

下列範例會使用 fn:id,根據 IDREF 管理員屬性擷取 <employee> 元素。 在此範例中,manager 屬性是 IDREF 類型屬性,而 eid 屬性是 ID 類型屬性。

針對特定的管理員屬性值, id() 函式會 <employee> 尋找識別碼類型屬性值符合輸入 IDRE光圈值的元素。 換句話說,對於特定員工, 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*的子類型。

另請參閱

序列上的函式