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 とを比較します。
使用例
このトピックでは、 AdventureWorks2012 データベースのさまざまな xml 型の列に格納されている XML インスタンスに対して実行する XQuery の例について説明します。
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 番目の引数が正しい引数でない場合も、実行時エラーを生成せずに、空の結果を返します。