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

次のいずれかの状態を表す bit 型を返します。

  • 1 (True)。クエリ内の XQuery 式により、空以外の結果が返されたことを示します。つまり、少なくとも 1 つの XML ノードが返されます。

  • 0 (False)。クエリ内の XQuery 式により、空の結果が返されたことを示します。

  • NULL。クエリの実行対象の xml データ型のインスタンスに NULL 値が含まれていたことを示します。

注意

exist() メソッドは、空でない結果を返す XQuery 式に対して 1 を返します。exist() メソッド内に true() 関数または false() 関数を指定した場合、exist() メソッドは 1 を返します。これは、true() 関数および false() 関数がブール値の True および False をそれぞれ返すためです (つまり、空でない結果が返されます)。したがって、次の例に示すように exist() は 1 (True) を返します。

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

構文

exist (XQuery) 

引数

  • XQuery
    文字列リテラルの XQuery 式です。

exist() メソッドを指定する例を次に示します。

例 : xml 型の変数に対する exist() メソッドの指定

次の例の @xxml 型の変数 (型指定されていない xml) です。また、@f は exist() メソッドにより返された値を格納する整数型の変数です。exist() メソッドは、XML インスタンスに格納されたデータ値が 2002-01-01 の場合に、True (1) を返します。

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() メソッドで日付を比較する際は、次のことに注意してください。

  • コード cast as xs:date? は、比較する値を xs:date 型にキャストします。

  • @Somedate 属性の値は型指定されません。この値は、比較するときに右側の比較対象の型である xs:date 型に暗黙的にキャストされます。

  • cast as xs:date() の代わりに、xs:date() コンストラクタ関数を使用できます。詳細については、「コンストラクター関数 (XQuery)」を参照してください。

次の例は、1 つ前の例と似ていますが、<Somedate> 要素が含まれている点が異なります。

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

上記のクエリでは、次の点に注意してください。

  • text() メソッドは、型指定されていない値 2002-01-01 が含まれたテキスト ノードを返します (この値の XQuery の型は xdt:untypedAtomic です)。この場合、暗黙的なキャストはサポートされないので、この型指定された値は明示的に x 型から xsd:date 型にキャストする必要があります。

例 : 型指定された xml 型の変数に対する exist() メソッドの指定

次の例では、xml 型の変数に対する exist() メソッドの使用方法について説明します。この例で使用する変数は、スキーマ名前空間コレクション名 ManuInstructionsSchemaCollection を指定しているため、型指定された XML 変数です。

この例では、まず製造手順書ドキュメントを変数に代入してから、exist() メソッドを使用して、このドキュメントに LocationID 属性の値が 50 の <Location> 要素が含まれているかどうかを調べます。

@x 変数に対して指定された exist() メソッドは、製造手順書ドキュメントに LocationID=50 の <Location> 要素が含まれている場合、1 (True) を返します。それ以外の場合は 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() メソッドの指定

次のクエリでは、仕様書である <Specifications> 要素がカタログの説明に含まれていない製品モデル ID を取得します。

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

上記のクエリでは、次の点に注意してください。

  • WHERE 句では、xml 型の CatalogDescription 列に対して指定された条件を満たす行のみが ProductDescription テーブルから選択されます。

  • WHERE 句の exist() メソッドは、XML に <Specifications> 要素が含まれていない場合、1 (True) を返します。not() 関数 (XQuery) が使用されていることに注意してください。

  • sql:column() 関数 (XQuery) を使用して、XML 以外の列から値を取得しています。

  • このクエリでは、空の行セットが返されます。

上のクエリでは、xml データ型の query() メソッドと exist() メソッドが指定されています。また、これら両方のメソッドのクエリのプロローグで、同じ名前空間が宣言されています。この場合、WITH XMLNAMESPACES を使用してプレフィックスを宣言し、そのプレフィックスをこのクエリに使用できます。

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