exist() メソッド (xml データ型)
適用対象: SQL Server Azure SQL Database Azure SQL Managed Instance
次のいずれかの状態を表す bit 型を返します。
クエリ内の XQuery 式により、空以外の結果が返された場合は 1 (True)。 つまり、少なくとも 1 つの XML ノードが返されます。
これにより、空の結果が返された場合は 0 (False)。
NULL の場合、xmlクエリの実行対象となるデータ型のインスタンスには、NULL が含まれています。
構文
exist (XQuery)
引数
XQuery
文字列リテラルの XQuery 式です。
解説
Note
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() メソッドを指定する例を次に示します。
例:xml 型の変数に対する exist() メソッドの指定
次の例の @x は xml 型の変数 (型指定されていない 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
> 要素が含まれているかどうかを調べます。
製造手順ドキュメントに LocationID=50
の <Location
> 要素が含まれている場合、@x 変数に対して指定された exist() メソッドでは 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 テーブルから選択されます。
XML に <
Specifications
> 要素が含まれていない場合、WHERE 句の exist() メソッドでは 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;
参照
WITH XMLNAMESPACES を使用したクエリへの名前空間の追加
型指定された XML と型指定されていない XML の比較
XML データのインスタンスの作成
xml データ型メソッド
XML データ変更言語 (XML DML)