次の方法で共有


QNames に関係する関数 - expanded-QName

適用対象:SQL Server

$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 型の正しい字句形式でない場合は、空のシーケンスが返され、動的エラーを表します。

  • xs:QName 型から他の型への変換は、SQL Serverではサポートされていません。 このため、 expanded-QName() 関数は XML 構築では使用できません。 たとえば、<e> expanded-QName(...) </e> など、ノードを構築する場合、型指定なしの値を使用する必要があります。 これは、expanded-QName() で返される xs:QName の値を xdt:untypedAtomic に変換する必要性を意味します。 ただし、これはサポートされていません。 ソリューションについては、このトピックの後半の例で説明します。

  • 既存の QName 型の値を変更または比較できます。 たとえば、 /root[1]/e[1] eq expanded-QName("http://nsURI" "myNS") は 要素 の値と expanded-QName<e>() 関数によって返される QName を比較します。

このトピックでは、データベース内のさまざまな xml 型の列に格納されている XML インスタンスに対する XQuery の例を AdventureWorks2022 示します。

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="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 の置換値を使用して、要素の値が置き換えられます。

-- 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  

expanded-QName() 関数は XML 構築ではサポートされていないため、次の試みは別 <root> の要素を追加しますが、失敗します。

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

これに対する解決策は、最初に 要素の値を持つインスタンスを <root> 挿入してから変更することです。 この例では、 要素が挿入されるときに nil 初期値が <root> 使用されます。 この例の XML スキーマ コレクションでは、 要素に nil 値を <root> 指定できます。

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 値を比較できます。 このクエリでは、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 番目の引数が正しくない場合に実行時エラーを発生させる代わりに空を返します。

参照

QNames に関係する関数 (XQuery)