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

適用対象: はいSQL Server はいAzure SQL Database いいえAzure Synapse Analytics (SQL DW) いいえParallel Data Warehouse APPLIES TO: YesSQL Server YesAzure SQL Database NoAzure Synapse Analytics (SQL DW) NoParallel Data Warehouse

次のいずれかの状態を表す bit 型を返します。Returns a bit that represents one of the following conditions:

  • クエリ内の XQuery 式により、空以外の結果が返された場合は 1 (True)。1, representing True, if the XQuery expression in a query returns a nonempty result. つまり、少なくとも 1 つの XML ノードが返されます。That is, it returns at least one XML node.

  • これにより、空の結果が返された場合は 0 (False)。0, representing False, if it returns an empty result.

  • NULL の場合、xmlクエリの実行対象となるデータ型のインスタンスには、NULL が含まれています。NULL if the xml data type instance against which the query was executed contains NULL.

構文Syntax

  
exist (XQuery)   

引数Arguments

XQueryXQuery
文字列リテラルの XQuery 式です。Is an XQuery expression, a string literal.

解説Remarks

注意

exist() メソッドは、空でない結果を返す XQuery 式に対して 1 を返します。The exist() method returns 1 for the XQuery expression that returns a nonempty result. exist() メソッド内に true() 関数または false() 関数を指定した場合、exist() メソッドは 1 を返します。これは、true() 関数および false() 関数がブール値の True および False をそれぞれ返すためですIf you specify the true() or false() functions inside the exist() method, the exist() method will return 1, because the functions true() and false() return Boolean True and False, respectively. (つまり、空でない結果が返されます)。That is, they return a nonempty result). したがって、次の例に示すように exist() は 1 (True) を返します。Therefore, exist() will return 1 (True), as shown in the following example:

declare @x xml;  
set @x='';  
select @x.exist('true()');   

Examples

exist() メソッドを指定する例を次に示します。The following examples show how to specify the exist() method.

例:xml 型の変数に対する exist() メソッドの指定Example: Specifying the exist() method against an xml type variable

次の例の @x は xml 型の変数 (型指定されていない xml) です。また、@f は exist() メソッドにより返された値を格納する整数型の変数です。In the following example, @x is an xml type variable (untyped xml) and @f is an integer type variable that stores the value returned by the exist() method. Exist() メソッドは、XML インスタンスに格納されている日付の値が 2002-01-01 である場合に True (1) を返します。The exist() method returns True (1) if the date value stored in the XML instance is 2002-01-01.

declare @x xml;  
declare @f bit;  
set @x = '<root Somedate = "2002-01-01Z"/>';  
set @f = @x.exist('/root[(@Somedate cast as xs:date?) eq xs:date("2002-01-01Z")]');  
select @f;  

exist() メソッドで日付を比較する際は、次のことに注意してください。In comparing dates in the exist() method, note the following:

  • コード cast as xs:date? は、比較する値を xs:date 型にキャストします。The code cast as xs:date? is used to cast the value to xs:date type for purposes of comparison.

  • @Somedate 属性の値は型指定されません。The value of the @Somedate attribute is untyped. この値は、比較するときに右側の比較対象の型である xs:date 型に暗黙的にキャストされます。In comparing this value, it is implicitly cast to the type on the right side of the comparison, the xs:date type.

  • cast as xs:date() の代わりに、xs:date() コンストラクター関数を使用できます。Instead of cast as xs:date(), you can use the xs:date() constructor function. 詳細については、「コンストラクター関数 (XQuery)」を参照してください。For more information, see Constructor Functions (XQuery).

次の例は、1 つ前の例と似ていますが、<Somedate> 要素が含まれている点が異なります。The following example is similar to the previous one, except it has a <Somedate> element.

DECLARE @x xml;  
DECLARE @f bit;  
SET @x = '<Somedate>2002-01-01Z</Somedate>';  
SET @f = @x.exist('/Somedate[(text()[1] cast as xs:date ?) = xs:date("2002-01-01Z") ]')  
SELECT @f;  

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

  • text() メソッドは、型指定されていない値 2002-01-01 が含まれたテキスト ノードを返しますThe text() method returns a text node that contains the untyped value 2002-01-01. (この値の XQuery の型は xdt:untypedAtomic です)。この場合、暗黙的なキャストはサポートされないので、この型指定された値は明示的に x 型から xsd:date 型にキャストする必要があります。(The XQuery type is xdt:untypedAtomic.) You must explicitly cast this typed value from x to xsd:date, because implicit casting is not supported in this case.

例:型指定された xml 型の変数に対する exist() メソッドの指定Example: Specifying the exist() method against a typed xml variable

次の例では、xml 型の変数に対する exist() メソッドの使用方法について説明します。The following example illustrates the use of the exist() method against an xml type variable. この例で使用する変数は、スキーマ名前空間コレクション名 ManuInstructionsSchemaCollection を指定しているため、型指定された XML 変数です。It is a typed XML variable, because it specifies the schema namespace collection name, ManuInstructionsSchemaCollection.

この例では、まず製造手順書ドキュメントを変数に代入してから、exist() メソッドを使用して、このドキュメントに LocationID 属性の値が 50 の <Location> 要素が含まれているかどうかを調べます。In the example, a manufacturing instructions document is first assigned to this variable and then the exist() method is used to find whether the document includes a <Location> element whose LocationID attribute value is 50.

@x 変数に対して指定された exist() メソッドは、製造手順書ドキュメントに LocationID=50 の <Location> 要素が含まれている場合、1 (True) を返します。The exist() method specified against the @x variable returns 1 (True) if the manufacturing instructions document includes a <Location> element that has LocationID=50. それ以外の場合は 0 (False) を返します。Otherwise, the method returns 0 (False).

DECLARE @x xml (Production.ManuInstructionsSchemaCollection);  
SELECT @x=Instructions  
FROM Production.ProductModel  
WHERE ProductModelID=67;  
--SELECT @x  
DECLARE @f int;  
SET @f = @x.exist(' declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
    /AWMI:root/AWMI:Location[@LocationID=50]  
');  
SELECT @f;  

例:xml 型の列に対する exist() メソッドの指定Example: Specifying the exist() method against an xml type column

次のクエリでは、仕様書である <Specifications> 要素がカタログの説明に含まれていない製品モデル ID を取得します。The following query retrieves product model IDs whose catalog descriptions do not include the specifications, <Specifications> element:

SELECT ProductModelID, CatalogDescription.query('  
declare namespace pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
    <Product   
        ProductModelID= "{ sql:column("ProductModelID") }"   
        />  
') AS Result  
FROM Production.ProductModel  
WHERE CatalogDescription.exist('  
    declare namespace  pd="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     /pd:ProductDescription[not(pd:Specifications)]'  
    ) = 1;  

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

  • WHERE 句では、xml 型の CatalogDescription 列に対して指定された条件を満たす行のみが ProductDescription テーブルから選択されます。The WHERE clause selects only those rows from the ProductDescription table that satisfy the condition specified against the CatalogDescription xml type column.

  • WHERE 句の exist() メソッドは、XML に <Specifications> 要素が含まれていない場合、1 (True) を返します。The exist() method in the WHERE clause returns 1 (True) if the XML does not include any <Specifications> element. not() 関数 (XQuery) が使用されていることに注意してください。Note the use of the not() function (XQuery).

  • sql:column() 関数 (XQuery) を使用して、XML 以外の列から値を取得しています。The sql:column() function (XQuery) function is used to bring in the value from a non-XML column.

  • このクエリでは、空の行セットが返されます。This query returns an empty rowset.

上のクエリでは、xml データ型の query() メソッドと exist() メソッドが指定されています。また、これら両方のメソッドのクエリのプロローグで、同じ名前空間が宣言されています。The query specifies query() and exist() methods of the xml data type and both these methods declare the same namespaces in the query prolog. この場合、WITH XMLNAMESPACES を使用してプレフィックスを宣言し、そのプレフィックスをこのクエリに使用できます。In this case, you may want to use WITH XMLNAMESPACES to declare the prefix and use it in the query.

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS pd)  
SELECT ProductModelID, CatalogDescription.query('  
    <Product   
        ProductModelID= "{ sql:column("ProductModelID") }"   
        />  
') AS Result  
FROM Production.ProductModel  
WHERE CatalogDescription.exist('  
     /pd:ProductDescription[not(pd:Specifications)]'  
    ) = 1;  

参照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)