value() メソッド (xml データ型)
適用対象: SQL Server
Azure SQL Database
Azure SQL Managed Instance
XML に対して XQuery を実行し、SQL 型の値を返します。 このメソッドは、スカラー値を返します。
このメソッドは、通常、xml 型の列、パラメーター、または変数に格納されている XML インスタンスから値を取得するために使用します。 この方法では、XML データを XML 以外の列のデータと結合または比較する SELECT
クエリを指定できます。
構文
value ( XQuery , SQLType )
Note
SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
XQuery
SQLType
返される優先 SQL 型 (文字列リテラル)。 このメソッドの戻り値の型は、SQLType パラメーターと一致します。 SQLType は、ユーザー定義の SQL データ型にすることができます。
Note
SQLType は、 xml、 image、 text、 ntext、、 sql_variant、または共通言語ランタイム (CLR) ユーザー定義型のデータ型にすることはできません。
value()
メソッドは、Transact-SQL CONVERT
演算子を暗黙的に使用します。 value()
は、シリアル化された文字列表現である XQuery 式の結果を、XML スキーマ定義 (XSD) 型から Transact-SQL 変換で指定された対応する SQL 型に変換しようとします。 CONVERT
の型キャスト規則の詳細については、「CAST と CONVERTを参照してください。
パフォーマンス上の理由から、述語で value()
メソッドを使用する代わりに、sql:column()
でexist()
を使用して、リレーショナル値と比較できます。 この exist()
例については、この記事の後半で説明します。
例
この記事の Transact-SQL コード サンプルは AdventureWorks2022
または AdventureWorksDW2022
サンプル データベースを使用します。このサンプル データベースは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできます。
A. XML 型変数に対して value() メソッドを使用する
次の例では、XML インスタンスは xml 型の変数に格納されます。 value()
メソッドは、XML から ProductID
属性の値を取得します。 その後、値は int 変数に割り当てられます。
DECLARE @myDoc XML;
DECLARE @ProdID INT;
SET @myDoc = '<Root>
<ProductDescription ProductID="1" ProductName="Road Bike">
<Features>
<Warranty>1 year parts and labor</Warranty>
<Maintenance>3 year parts and labor extended maintenance is available</Maintenance>
</Features>
</ProductDescription>
</Root>';
SET @ProdID = @myDoc.value('(/Root/ProductDescription/@ProductID)[1]', 'int');
SELECT @ProdID;
結果として 1
の値が返されます。
XML インスタンスには ProductID
属性が 1 つだけありますが、静的な型指定規則では、パス式がシングルトンを返すように明示的に指定する必要があります。 したがって、パス式の末尾に [1]
が追加されます。 静的な型指定の詳細については、「XQuery と静的な型指定」を参照してください。
B. value() メソッドを使用して XML 型の列から整数値を取得する
次のクエリは、AdventureWorks2022
データベースの xml 型の列 (CatalogDescription
) に対して指定されています。 このクエリは、この列に格納されている各 XML インスタンスから ProductModelID
属性の値を取得します。
SELECT CatalogDescription.value(
'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
(/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
ORDER BY Result DESC;
前のクエリの注:
namespace
キーワードを使用して名前空間プレフィックスが定義されています。静的な型指定の要件により、
[1]
メソッドのパス式の末尾にvalue()
を追加して、パス式が単一の値を返すことを明示的に指定しています。
結果セットは次のようになります。
35
34
28
25
23
19
C: value() メソッドを使用して XML 型の列から文字列値を取得する
次のクエリは、AdventureWorks2022
データベースの xml 型列 (CatalogDescription
) に対して指定されます。 このクエリは、この列に格納されている各 XML インスタンスから ProductModelName
属性の値を取得します。
SELECT CatalogDescription.value(
'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
(/PD:ProductDescription/@ProductModelName)[1]', 'varchar(50)') AS Result
FROM Production.ProductModel
WHERE CatalogDescription IS NOT NULL
ORDER BY Result DESC;
前のクエリの注:
namespace
キーワードを使用して名前空間プレフィックスが定義されています。静的な型指定の要件により、
[1]
メソッドのパス式の末尾にvalue()
を追加して、パス式が単一の値を返すことを明示的に指定しています。
結果セットは次のようになります。
Touring-2000
Touring-1000
Road-450
Road-150
Mountain-500
Mountain 100
D. value() メソッドと exist() メソッドを使用して XML 型の列から値を取得する
次の例では、xml データ型の value()
メソッドと exist() メソッドの使い方を示しています。 value()
メソッドは、XML から ProductModelID
属性値を取得するために使用されます。 WHERE
句の exist()
メソッドは、テーブルの行をフィルターで選択するために使用されています。
このクエリは、要素の 1 つとして保証内容 (<> 要素) を含む XML インスタンスから製品モデル ID を取得します。 WHERE
句の条件では、exist()
メソッドを使用して、この条件を満たす行のみを取得しています。
SELECT CatalogDescription.value(
'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
(/PD:ProductDescription/@ProductModelID)[1]', 'int') AS Result
FROM Production.ProductModel
WHERE CatalogDescription.exist(
'declare namespace PD="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";
declare namespace wm="http://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelWarrAndMain";
/PD:ProductDescription/PD:Features/wm:Warranty') = 1;
前のクエリの注:
CatalogDescription
列は、型指定された XML 列です。 つまり、この列にはスキーマ コレクションが関連付けられています。 Modules と Prologs - XQuery Prolog では、名前空間宣言を使用して、クエリ本文の後半で使用されるプレフィックスを定義します。exist()
メソッドが1
(true) を返す場合は、XML インスタンスに<Warranty>
子要素が機能の 1 つとして含まれていることを示します。その場合は、
value()
句のSELECT
メソッドが、ProductModelID
属性の値を整数値として取得します。
次に結果の一部を示します。
19
23
...
E. value() メソッドの代わりに exist() メソッドを使用する
パフォーマンス上の理由から、リレーショナル値との比較を行う述語内では value()
メソッドではなく、exist()
と sql:column()
を使用してください。 次に例を示します。
CREATE TABLE T (c1 INT, c2 VARCHAR(10), c3 XML);
GO
SELECT c1, c2, c3
FROM T
WHERE c3.value('(/root/@a)[1]', 'integer') = c1;
GO
このコードは、次のように書き換えることができます。
SELECT c1, c2, c3
FROM T
WHERE c3.exist('/root[@a=sql:column("c1")]') = 1;
GO