分享方式:


與 QNames 相關的函式 - expanded-QName

適用於:SQL Server

傳回 xs:QName 類型的值,其中包含$paramURI 中指定的 命名空間 URI,以及$paramLocal 中指定的 本機名稱。 如果 $paramURI 是空字串或空序列,則表示沒有命名空間。

語法

fn:expanded-QName($paramURI as xs:string?, $paramLocal as xs:string?) as xs:QName?  

引數

$paramURI
這是 QName 的命名空間 URI。

$paramLocal
這是 QName 的本機名稱部分。

備註

下列適用于 expanded-QName() 函式:

  • 如果指定的$paramLocal 值不是 xs:NCName 類型的正確語彙形式,則會傳回空序列並代表動態錯誤。

  • SQL Server 不支援從 xs:QName 類型轉換成任何其他類型。 因此, expanded-QName() 函式無法用於 XML 建構。 例如,當您建構節點時,例如 <e> expanded-QName(...) </e> ,值必須不具類型。 這需要您將 所 expanded-QName() 傳回的 xs:QName 類型值轉換為 xdt:untypedAtomic。 不過,不支援此功能。 本主題稍後的範例會提供解決方案。

  • 您可以修改或比較現有的 QName 類型值。 例如, /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") 比較 元素 <>e 的值與 expanded-QName() 函式所傳回的 QName。

範例

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

A. 取代 QName 類型節點值

此範例說明如何修改 QName 類型的專案節點值。 此範例會執行下列動作:

  • 建立 XML 架構集合,以定義 QName 類型的專案。

  • 使用 XML 架構集合建立具有 xml 類型資料行的資料表。

  • 將 XML 實例儲存在資料表中。

  • 使用 xml 資料類型的 modify() 方法來修改 實例中 QName 類型專案的值。 expanded-QName() 函式可用來產生新的 QName 類型值。

-- If XML schema collection (if exists)  
-- drop xml schema collection SC  
-- go  
-- Create XML schema collection  
CREATE XML SCHEMA COLLECTION SC AS N'  
<schema xmlns="http://www.w3.org/2001/XMLSchema"  
    xmlns:xs="http://www.w3.org/2001/XMLSchema"   
    targetNamespace="QNameXSD"   
      xmlns:xqo="QNameXSD" elementFormDefault="qualified">  
      <element name="Root" type="xqo:rootType" />  
      <complexType name="rootType">  
            <sequence minOccurs="1" maxOccurs="1">  
                        <element name="ElemQN" type="xs:QName" />  
            </sequence>  
      </complexType>  
</schema>'  
go  
-- Create table.  
CREATE TABLE T( XmlCol xml(SC) )  
-- Insert sample XML instnace  
INSERT INTO T VALUES ('  
<Root xmlns="QNameXSD" xmlns:ns="https://myURI">  
      <ElemQN>ns:someName</ElemQN>  
</Root>')  
go  
-- Verify the insertion  
SELECT * from T  
go  
-- Result  
<Root xmlns="QNameXSD" xmlns:ns="https://myURI">  
  <ElemQN>ns:someName</ElemQN>  
</Root>   

在下列查詢中, <ElemQN> 元素值會使用 xml 資料類型的 modify() 方法取代,並取代 XML DML 的 replace 值,如下所示。

-- the value.  
UPDATE T   
SET XmlCol.modify('  
  declare default element namespace "QNameXSD";   
  replace value of /Root[1]/ElemQN   
  with expanded-QName("https://myURI", "myLocalName") ')  
go  
-- Verify the result  
SELECT * from T  
go  

以下是結果。 請注意,QName 類型的元素 <ElemQN> 現在有新的值:

<Root xmlns="QNameXSD" xmlns:ns="urn">  
  <ElemQN xmlns:p1="https://myURI">p1:myLocalName</ElemQN>  
</Root>  

下列語句會移除範例中使用的 物件。

-- Cleanup  
DROP TABLE T  
go  
drop xml schema collection SC  
go  

B. 使用 expanded-QName() 函式時處理限制

expanded-QName 函式不能用於 XML 建構。 說明如下例。 為了解決這個問題,此範例會先插入節點,然後修改節點。

-- if exists drop the table T  
--drop table T  
-- go  
-- Create XML schema collection  
-- DROP XML SCHEMA COLLECTION SC  
-- go  
CREATE XML SCHEMA COLLECTION SC AS '  
<schema xmlns="http://www.w3.org/2001/XMLSchema">  
      <element name="root" type="QName" nillable="true"/>  
</schema>'  
go  
 -- Create table T with a typed xml column (using the XML schema collection)  
CREATE TABLE T (xmlCol XML(SC))  
go  
-- Insert an XML instance.  
insert into T values ('<root xmlns:a="https://someURI">a:b</root>')  
 go  
-- Verify  
SELECT *   
FROM T  

下列嘗試會新增另一個 <root> 元素,但失敗,因為 XML 建構不支援 expanded-QName() 函式。

update T SET xmlCol.modify('  
insert <root>{expanded-QName("http://ns","someLocalName")}</root> as last into / ')  
go  

這個的解決方案是先插入具有 元素值的 <root> 實例,然後加以修改。 在此範例中,插入專案時 <root> 會使用 nil 初始值。 此範例中的 XML 架構集合允許 元素的 <root> nil 值。

update T SET xmlCol.modify('  
insert <root xsi:nil="true"/> as last into / ')  
go  
-- now replace the nil value with another QName.  
update T SET xmlCol.modify('  
replace value of /root[last()] with expanded-QName("http://ns","someLocalName") ')  
go  
 -- verify   
SELECT * FROM T  
go  
-- result  
<root>b</root>  

<root xmlns:a="https://someURI">a:b</root>

<root xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:p1="http://ns">p1:someLocalName</root>

您可以比較 QName 值,如下列查詢所示。 查詢只會 <root> 傳回值符合 expanded-QName() 函式所 傳回之 QName 類型值的專案。

SELECT xmlCol.query('  
    for $i in /root  
    return  
       if ($i eq expanded-QName("http://ns","someLocalName") ) then  
          $i  
       else  
          ()')  
FROM T  

實作限制

有一項限制: expanded-QName() 函式接受空序列做為第二個引數,而且會在第二個引數不正確時傳回空白,而不是引發執行階段錯誤。

另請參閱

與 QNames 相關的函式 (XQuery)