原始式 (XQuery)
XQuery 原始式には、リテラル、変数参照、コンテキスト アイテム式、コンストラクター、および関数呼び出しがあります。
リテラル
XQuery リテラルには、数値型または文字列型のリテラルを使用できます。 文字列リテラルには、定義済みのエンティティ参照を含めることができます。エンティティ参照は文字のシーケンスです。 シーケンスは、構文上意味を持つことも考えられる 1 文字を表すアンパサンドで始まります。 XQuery の定義済みエンティティ参照を次に示します。
エンティティ参照 |
意味 |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
文字列リテラルには、10 進または 16 進のコード ポイントで識別される文字参照 (Unicode 文字への XML 形式の参照) を含めることもできます。 たとえば、ユーロの通貨記号は "€" という文字参照で表すことができます。
注 |
---|
SQL Server では、XML Version 1.0 が解析の基準として使用されます。 |
使用例
リテラル、エンティティ参照、および文字参照の使用方法を次の例に示します。
'<' 文字、および '>' 文字には特別な意味があるため、このコードはエラーを返します。
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO
代わりにエンティティ参照を使用すると、このクエリは動作します。
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <SalaryRange>Salary > 50000 and < 100000</SalaryRange>')
GO
文字参照を使用してユーロの通貨記号を表す方法を次の例に示します。
DECLARE @var XML
SET @var = ''
SELECT @var.query(' <a>€12.50</a>')
結果は次のとおりです。
<a>€12.50</a>
次の例では、クエリをアポストロフィで区切っています。 この場合、文字列値のアポストロフィは隣接した 2 つのアポストロフィで表されます。
DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>I don''t know</a>')
Go
結果は次のとおりです。
<a>I don't know</a>
次の例に示すように、組み込みの Boolean 型の関数である true() および false() を使用して、Boolean 型の値を表すことができます。
DECLARE @var XML
SET @var = ''
SELECT @var.query('<a>{true()}</a>')
GO
直接要素コンストラクターにより、式が中かっこ内に指定されています。 結果の XML では、式の結果値で置き換えられます。
結果は次のとおりです。
<a>true</a>
変数参照
XQuery 内の変数参照は前にドル記号 ($) が付いた QName で表されます。 この実装では、プレフィックスのない変数参照だけがサポートされます。 たとえば、次のクエリでは、変数 $i は FLWOR 式の中で定義されています。
DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
for $i in /root return data($i)')
GO
次のクエリは、変数名に名前空間プレフィックスが加えられているため動作しません。
DECLARE @var XML
SET @var = '<root>1</root>'
SELECT @var.query('
DECLARE namespace x="http://X";
for $x:i in /root return data($x:i)')
GO
次のクエリで示すように、sql:variable() 拡張関数を使用して SQL 変数を参照できます。
DECLARE @price money
SET @price=2500
DECLARE @x xml
SET @x = ''
SELECT @x.query('<value>{sql:variable("@price") }</value>')
結果は次のとおりです。
<value>2500</value>
実装の制限事項
次に、実装の制限事項を示します。
名前空間プレフィックス付きの変数はサポートされていません。
モジュールのインポートはサポートされていません。
外部変数の宣言はサポートされていません。 解決方法として、sql:variable() 関数を使用することもできます。
コンテキスト アイテム式
コンテキスト アイテムは、パス式のコンテキストで現在処理中のアイテムです。 コンテキスト アイテムが NULL ではない XML データ型インスタンス内にある場合は、ドキュメント ノードで初期化されます。 また、XPath 式のコンテキスト、または [] 述語の中で、nodes() メソッドを使用して変更することもできます。
コンテキスト アイテムはドット (.) を含む式によって返されます。 たとえば、次のクエリでは、各 <a> 要素について attr 属性が存在するかどうかを評価します。 attr 属性が存在する場合は、その要素が返されます。 述語の中の条件は、コンテキスト ノードが 1 つのピリオドで指定されていることを示しています。
DECLARE @var XML
SET @var = '<ROOT>
<a>1</a>
<a attr="1">2</a>
</ROOT>'
SELECT @var.query('/ROOT[1]/a[./@attr]')
結果は次のとおりです。
<a attr="1">2</a>
関数の呼び出し
組み込みの XQuery 関数や、SQL Server sql:variable() 関数、および sql:column() 関数を呼び出すことができます。 実装済み関数の一覧については、「xml データ型に対する XQuery 関数」を参照してください。
実装の制限事項
次に、実装の制限事項を示します。
XQuery プロローグでの関数定義はサポートされていません。
関数のインポートはサポートされていません。