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() メソッドの指定
次の例の @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> 要素が含まれているかどうかを調べます。
@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