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() 例は、この記事の後半で示します。

この記事には AdventureWorks2022 サンプル データベースが必要です。このサンプル データベースは、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 インスタンスには属性が 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