原始式 (XQuery)
適用対象: SQL Server
XQuery のプライマリ式には、リテラル、変数参照、コンテキスト項目式、コンストラクター、関数呼び出しが含まれます。
リテラル
XQuery リテラルには、数値リテラルまたは文字列リテラルを指定できます。 文字列リテラルには、定義済みのエンティティ参照を含めることができます。エンティティ参照は文字のシーケンスです。 シーケンスは、構文上意味を持つことも考えられる 1 文字を表すアンパサンドで始まります。 XQuery の定義済みエンティティ参照を次に示します。
エンティティの参照 | 表現 |
---|---|
< |
< |
> |
> |
& |
& |
" |
" |
' |
' |
文字列リテラルには、10 進数または 16 進数のコード ポイントで識別される文字参照、Unicode 文字への XML スタイルの参照を含めることもできます。 たとえば、ユーロ記号は文字参照 ">#8364;" で表すことができます。
Note
SQL Server では、解析の基礎として XML バージョン 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>
組み込みのブール関数 ( true() と false()は、次の例に示すように、ブール値を表すために使用できます。
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="https://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() メソッドによって変更することもできます。
コンテキスト アイテムはドット (.) を含む式によって返されます。 たとえば、次のクエリでは、属性attr
の存在について、各要素<a
>を評価します。 属性が存在する場合は、要素が返されます。 述語の条件では、コンテキスト ノードが 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 プロローグでの関数定義はサポートされていません。
関数のインポートはサポートされていません。