XML データ内部のリレーショナル データのバインド
xml データ型の変数または列には、xml データ型のメソッドを指定できます。たとえば、query() メソッド (xml データ型) では、XML インスタンスに対して指定した XQuery が実行されます。この方法で XML を構築するときに、XML 以外の型の列の値や Transact-SQL 変数を使用することもできます。この処理を、XML 内部のリレーショナル データのバインドと呼びます。
XML 内部の XML 以外のリレーショナル データをバインドするために、SQL Server データベース エンジンには次の擬似関数が用意されています。
sql:column() 関数 (XQuery)。この関数を使用すると、リレーショナル列の値を XQuery 式または XML DML 式で使用できます。
sql:variable() 関数 (XQuery)。この関数を使用すると、SQL 変数の値を XQuery 式または XML DML 式で使用できます。
XML 内部でリレーショナル値を公開するときは、常に、xml データ型のメソッドと上記の関数を併用できます。
xml 型の列や変数、CLR ユーザー定義型、datetime、smalldatetime、text、ntext、sql_variant、および image の各型のデータを参照する場合は、これらの関数は使用できません。
また、このバインドは読み取り専用です。つまり、これらの関数を使用する列には、データを書き込めません。たとえば、sql:variable("@x")="some expression" は使用できません。
例 : sql:variable() を使用した複数の領域にまたがるクエリ
次の例では、sql:variable() を使用してアプリケーションでクエリをパラメータ化できるようにする方法を示します。ISBN は、SQL 変数 @isbn を使用して渡されます。定数を sql:variable() に置き換えたことにより、ISBN が 0-7356-1588-2 の書籍だけでなく、どの ISBN でも検索できます。
DECLARE @isbn varchar(20)
SET @isbn = '0-7356-1588-2'
SELECT xCol
FROM T
WHERE xCol.exist ('/book/@ISBN[. = sql:variable("@isbn")]') = 1
sql:column() も同様に使用できますが、より多くの利点があります。コストベースのクエリ オプティマイザの判断により、効率を上げるために列のインデックスが使用される場合があります。また、昇格したプロパティが計算列に保存される場合があります。