value() メソッド (xml データ型)
適用対象:SQL ServerAzure SQL DatabaseAzure SQL Managed Instance
XML に対して XQuery を実行し、SQL 型の値を返します。 このメソッドは、スカラー値を返します。
このメソッドは、通常、xml 型の列、パラメーター、または変数に格納されている XML インスタンスから値を取得するために使用します。 この方法では、XML データを XML 以外の列のデータと結合または比較するクエリを指定 SELECT
できます。
構文
value ( XQuery , SQLType )
Note
SQL Server 2014 (12.x) 以前のバージョンの Transact-SQL 構文を確認するには、以前のバージョンのドキュメントを参照してください。
引数
XQuery
XML インスタンス内の データを取得する文字列リテラルである XQuery 式。 XQuery により、返される値は最大 1 つである必要があります。 それ以外の場合は、エラーが返されます。
SQLType
返される優先 SQL 型 (文字列リテラル)。 このメソッドの戻り値の型は、SQLType パラメーターと一致します。 SQLType は、xml データ型、共通言語ランタイム (CLR) ユーザー定義型、イメージ、テキスト、n テキスト、またはsql_variantデータ型にすることはできません。 SQLType には、ユーザー定義の SQL データ型を指定できます。
このメソッドは value()
、Transact-SQL CONVERT
演算子を暗黙的に使用します。 value()
は、シリアル化された文字列表現である XQuery 式の結果を、XML スキーマ定義 (XSD) 型から Transact-SQL 変換で指定された対応する SQL 型に変換しようとします。 型キャスト規則CONVERT
の詳細については、CAST および CONVERT を参照してください。
パフォーマンス上の理由から、述語でメソッドをvalue()
使用する代わりに、リレーショナル値と比較するために使用できます。exist()
sql:column()
この exist()
例は、この記事の後半で示します。
例
この記事の Transact-SQL コード サンプルでは、Microsoft SQL Server サンプルとコミュニティ プロジェクトのホーム ページからダウンロードできるサンプル データベースを使用AdventureWorks2022
します。
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 インスタンスには属性が 1 つだけ ProductID
ありますが、静的な型指定規則では、パス式がシングルトンを返すように明示的に指定する必要があります。 したがって、パス [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
...
C: 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()
(true) を返す1
場合は、XML インスタンスに機能の 1 つとして子要素が含まれていること<Warranty>
を示します。その場合は、
value()
句のSELECT
メソッドが、ProductModelID
属性の値を整数値として取得します。
部分的な結果を次に示します。
19
23
...
D. 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
関連するコンテンツ
フィードバック
https://aka.ms/ContentUserFeedback」を参照してください。
以下は間もなく提供いたします。2024 年を通じて、コンテンツのフィードバック メカニズムとして GitHub の issue を段階的に廃止し、新しいフィードバック システムに置き換えます。 詳細については、「フィードバックの送信と表示