expanded-QName (XQuery)

$paramURI に指定された名前空間 URI と $paramLocal に指定されたローカル名を使用して xs:QName 型の値を返します。$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 とを比較します。

このトピックでは、AdventureWorks データベースのさまざまな xml 型の列に格納されている XML インスタンスに対する XQuery の例について説明します。これらの各列の概要については、「AdventureWorks データベースの xml データ型表現」を参照してください。

A. QName 型ノードの値を置換する

この例では、QName 型の要素ノードの値を変更する方法を示しています。この例では、次の操作が実行されます。

  • QName 型の要素を定義する XML スキーマ コレクションを作成します。

  • 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() メソッドと XML DML "replace value of" を使用して、<ElemQN> 要素の値を置き換えています。

-- 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> 要素を追加するステートメントですが、expanded-QName() 関数は XML 構築ではサポートされていないので失敗します。

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 値は比較できます。このクエリは、expanded-QName() 関数で返された QName 型の値と一致する値を持つ <root> 要素のみを返します。

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

実装の制限事項

実装の制限事項は 1 つです。expanded-QName() 関数は、2 番目の引数に空のシーケンスを許容し、2 番目の引数が正しい引数でない場合も、実行時エラーを生成せずに、空の結果を返します。