value() メソッド (xml データ型)value() Method (xml Data Type)

適用対象:○SQL Server (2008 以降)○Azure SQL Database×Azure SQL Data Warehouse ×Parallel Data Warehouse THIS TOPIC APPLIES TO:yesSQL Server (starting with 2008)yesAzure SQL DatabasenoAzure SQL Data Warehouse noParallel Data Warehouse

XML に対して XQuery を実行し、SQL 型の値を返します。Performs an XQuery against the XML and returns a value of SQL type. このメソッドは、スカラー値を返します。This method returns a scalar value.

このメソッドは、通常、xml 型の列、パラメーター、または変数に格納されている XML インスタンスから値を取得するために使用します。You typically use this method to extract a value from an XML instance stored in an xml type column, parameter, or variable. このメソッドを使用すると、XML データと XML 型ではない列のデータを結合したり、比較する SELECT クエリを指定することができます。In this way, you can specify SELECT queries that combine or compare XML data with data in non-XML columns.

構文Syntax


value (XQuery, SQLType)  

引数Arguments

XQueryXQuery
XML インスタンス内のデータを取得する XQuery 式 (文字列リテラル) です。Is the XQuery expression, a string literal, that retrieves data inside the XML instance. XQuery により、返される値は最大 1 つである必要があります。The XQuery must return at most one value. それ以外の式を指定すると、エラーが返されます。Otherwise, an error is returned.

SQLTypeSQLType
正常な結果として返される SQL 型 (文字列リテラル) です。Is the preferred SQL type, a string literal, to be returned. このメソッドの戻り値の型は、SQLType パラメーターと一致します。The return type of this method matches the SQLType parameter. SQLType は、xml データ型、共通言語ランタイム (CLR) ユーザー定義型、imagetextntext、または sql_variant データ型にすることはできません。SQLType cannot be an xml data type, a common language runtime (CLR) user-defined type, image, text, ntext, or sql_variant data type. SQLType には、SQL ユーザー定義データ型を指定できます。SQLType can be an SQL, user-defined data type.

value() メソッドは、 Transact-SQLTransact-SQL の CONVERT 演算子を暗黙的に使用し、XQuery 式の結果 (シリアル化された文字列形式) を XSD 型から Transact-SQLTransact-SQL 変換で指定されている対応する SQL 型に変換しようと試みます。The value() method uses the Transact-SQLTransact-SQL CONVERT operator implicitly and tries to convert the result of the XQuery expression, the serialized string representation, from XSD type to the corresponding SQL type specified by Transact-SQLTransact-SQL conversion. CONVERT の型キャストの規則の詳細については、「CAST および CONVERT (Transact-SQL)」を参照してください。For more information about type casting rules for CONVERT, see CAST and CONVERT (Transact-SQL).

注意

パフォーマンス上の理由から、リレーショナル値との比較を行う述語内では value() メソッドではなく、exist()sql:column() を使用してください。For performance reasons, instead of using the value() method in a predicate to compare with a relational value, use exist() with sql:column(). これは、下の例 D で示しています。This is shown in example D that follows.

使用例Examples

A.A. xml 型の変数に対する value() メソッドの使用Using the value() method against an xml type variable

次の例では、XML インスタンスが xml 型の変数に格納されています。In the following example, an XML instance is stored in a variable of xml type. value() メソッドは、XML から ProductID 属性の値を取得します。The value() method retrieves the ProductID attribute value from the XML. その後、この値は int 変数に代入されます。The value is then assigned to an int variable.

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 が結果として返されます。Value 1 is returned as a result.

この場合、XML インスタンスに ProductID 属性は 1 つしかありませんが、静的な型指定の規則により、パス式がシングルトンを返すことを明示的に指定する必要があります。Although there is only one ProductID attribute in the XML instance, the static typing rules require you to explicitly specify that the path expression returns a singleton. このため、パス式の末尾に [1] が追加されています。Therefore, the additional [1] is specified at the end of the path expression. 静的な型指定の詳細については、「XQuery と静的な型指定」を参照してください。For more information about static typing, see XQuery and Static Typing.

B.B. value() メソッドを使用した xml 型列の値の取得Using the value() method to retrieve a value from an xml type column

次のクエリは、AdventureWorks データベースの xml 型の列 (CatalogDescription) に対して指定されています。The following query is specified against an xml type column (CatalogDescription) in the AdventureWorks database. このクエリは、この列に格納されている各 XML インスタンスから ProductModelID 属性の値を取得します。The query retrieves ProductModelID attribute values from each XML instance stored in the column.

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             

上のクエリに関して、次の点に注意してください。Note the following from the previous query:

  • namespace キーワードを使用して名前空間プレフィックスが定義されています。The namespace keyword is used to define a namespace prefix.

  • 静的な型指定の要件により、[1] メソッドのパス式の末尾に value() を追加して、パス式が単一の値を返すことを明示的に指定しています。Per static typing requirements, [1] is added at the end of the path expression in the value() method to explicitly indicate that the path expression returns a singleton.

    結果の一部を次に示します。This is the partial result:

-----------  
35           
34           
...  

C.C. value() メソッドと exist() メソッドを使用した xml 型列の値の取得Using the value() and exist() methods to retrieve values from an xml type column

次の例では、xml データ型の value() メソッドと exist() メソッドの使い方を示しています。The following example shows using both the value() method and the exist() method of the xml data type. value() メソッドは、XML から ProductModelID 属性値を取得するために使用されます。The value() method is used to retrieve ProductModelID attribute values from the XML. WHERE 句の exist() メソッドは、テーブルの行をフィルターで選択するために使用されています。The exist() method in the WHERE clause is used to filter the rows from the table.

このクエリは、要素の 1 つとして保証内容 (<Warranty> 要素) を含む XML インスタンスから製品モデル ID を取得します。The query retrieves product model IDs from XML instances that include warranty information (the <Warranty> element) as one of the features. WHERE 句の条件では、exist() メソッドを使用して、この条件を満たす行のみを取得しています。The condition in the WHERE clause uses the exist() method to retrieve only the rows satisfying this condition.

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  

上のクエリに関して、次の点に注意してください。Note the following from the previous query:

  • CatalogDescription 列は、型指定された XML 列です。The CatalogDescription column is a typed XML column. つまり、この列にはスキーマ コレクションが関連付けられています。This means that it has a schema collection associated with it. XQuery プロローグでは、名前空間の宣言を使用して、後でクエリ本文で使用するプレフィックスを定義しています。In the XQuery Prolog, the namespace declaration is used to define the prefix that is used later in the query body.

  • exist() メソッドが 1 (True) を返す場合、XML インスタンスには特性の 1 つとして <Warranty> 子要素が含まれています。If the exist() method returns a 1 (True), it indicates that the XML instance includes the <Warranty> child element as one of the features.

  • その場合は、value() 句の SELECT メソッドが、ProductModelID 属性の値を整数値として取得します。The value() method in the SELECT clause then retrieves the ProductModelID attribute values as integers.

    結果の一部を次に示します。This is the partial result:

Result       
-----------  
19           
23           
...  

D.D. value() メソッドの代替としての exist() メソッドの使用Using the exist() method instead of the value() method

パフォーマンス上の理由から、リレーショナル値との比較を行う述語内では value() メソッドではなく、exist()sql:column() を使用してください。For performance reasons, instead of using the value() method in a predicate to compare with a relational value, use exist() with sql:column(). 例 :For example:

CREATE TABLE T (c1 int, c2 varchar(10), c3 xml)  
GO  

SELECT c1, c2, c3   
FROM T  
WHERE c3.value( '/root[1]/@a', 'integer') = c1  
GO  

上記のクエリは、次のように記述することもできます。This can be written in the following way:

SELECT c1, c2, c3   
FROM T  
WHERE c3.exist( '/root[@a=sql:column("c1")]') = 1  
GO  

参照See Also

WITH XMLNAMESPACES を使用したクエリへの名前空間の追加 Add Namespaces to Queries with WITH XMLNAMESPACES
型指定された XML と型指定されていない XML の比較 Compare Typed XML to Untyped XML
XML データのインスタンスの作成 Create Instances of XML Data
xml データ型メソッド xml Data Type Methods
XML データ変更言語 (XML DML)XML Data Modification Language (XML DML)