expanded-QName (XQuery)

傳回 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 執行個體提供 XQuery 範例,這些執行個體是儲存在 AdventureWorks 資料庫的數個 xml 類型資料行中。如需這些資料行中每個資料行的概觀,請參閱<在 AdventureWorks 資料庫中的 xml 資料類型表示法>。

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="http://myURI">
      <ElemQN>ns:someName</ElemQN>
</Root>')
go
-- Verify the insertion
SELECT * from T
go
-- Result
<Root xmlns="QNameXSD" xmlns:ns="http://myURI">
  <ElemQN>ns:someName</ElemQN>
</Root> 

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

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

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

<Root xmlns="QNameXSD" xmlns:ns="urn">
  <ElemQN xmlns:p1="http://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="http://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="http://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() 函數可接受空白時序做為第二個引數,而且當第二個引數不正確時,將會傳回空白,並不會引發執行階段的錯誤。