sql:variable() 関数 (XQuery)
SQL リレーショナル値を含む変数を XML データ インスタンス内部に公開します。
構文
sql:variable("variableName") as xdt:anyAtomicType?
解説
「XML データ内部のリレーショナル データのバインド」で説明したように、XML データ型のメソッドを使用して XML 内部にリレーショナル値を公開する場合は、この関数を使用できます。
たとえば、xml データ型の変数や列に格納された XML インスタンスに対するクエリを指定するには、query() メソッドを使用します。また、場合によっては、リレーショナル データと XML データを一緒にするために、Transact-SQL 変数の値 (パラメータ) をクエリで使用することもできます。これを行うには、sql:variable 関数を使用します。
SQL 値は、対応する XQuery 値にマップされ、その型は対応する SQL 型に相当する XQuery 基本データ型になります。
SQL Server 2005 では、xml 型または共通言語ランタイム (CLR) ユーザー定義型の値は参照できません。
例
A. Transact-SQL 変数の値を XML にする sql:variable() 関数の使用
次の例では、次の値で構成される XML インスタンスを構築します。
- XML 以外の列の値 (
ProductID
)。XML にこの値をバインドするために、sql:column() 関数を使用します。 - 他のテーブルの XML 以外の列の値 (
ListPrice
)。ここでも、XML にこの値をバインドするために、sql:column()
を使用します。 - Transact-SQL 変数の値 (
DiscountPrice
)。XML にこの値をバインドするために、sql:variable()
メソッドを使用します。 - さらに、このクエリでは、説明を目的として xml 型列の値 (
ProductModelName
) も使用します。
クエリは次のとおりです。
DECLARE @price money
SET @price=2500.00
SELECT ProductID, Production.ProductModel.ProductModelID,CatalogDescription.query('
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
<Product
ProductID="{ sql:column("Production.Product.ProductID") }"
ProductModelID= "{ sql:column("Production.Product.ProductModelID") }"
ProductModelName="{/pd:ProductDescription[1]/@ProductModelName }"
ListPrice="{ sql:column("Production.Product.ListPrice") }"
DiscountPrice="{ sql:variable("@price") }"
/>')
FROM Production.Product
JOIN Production.ProductModel
ON Production.Product.ProductModelID = Production.ProductModel.ProductModelID
WHERE ProductID=771
上記のクエリでは、次の点に注意してください。
query()
メソッド内の XQuery により、XML が構築されます。- XQuery プロローグで、
namespace
キーワードを使用して名前空間プレフィックスが定義されています。これは、関連付けられたスキーマを持つ xml 型のCatalogDescription
列からProductModelName
属性値を取得するためです。
次に結果を示します。
<Product ProductID="771" ProductModelID="19"
ProductModelName="Mountain 100"
ListPrice="3399.99" DiscountPrice="2500" />
参照
関連項目
概念
型指定された XML と型指定されていない XML
xml データ型
XML インスタンスの生成
XML DML (XML データ変更言語)