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