exist() 方法(xml 数据类型)

适用于:SQL ServerAzure SQL 数据库Azure SQL 托管实例

返回位,表示下列条件之一:

  • 1,表示 True(如果查询中的 XQuery 表达式返回一个非空结果)。 即,它至少返回一个 XML 节点。

  • 0,表示 False(如果它返回一个空结果)。

  • NULL(如果执行查询的 xml 数据类型实例包含 NULL)。

语法

exist (XQuery)   

注意

若要查看 SQL Server 2014 (12.x) 及更早版本的 Transact-SQL 语法,请参阅早期版本文档

自变量

XQuery
是一个 XQuery 表达式,字符串文字。

备注

注意

对于返回非空结果的 XQuery 表达式,exist() 方法返回 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() 方法返回的值 。 如果 XML 实例中存储的日期值为 2002-01-01,exist() 方法返回 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 类型)。

  • 可使用 xs:date() 构造函数,而非 cast as xs:date() 。 有关详细信息,请参阅构造函数 (XQuery)

下面的示例与上一示例类似,不同之处在于它具有 <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() 方法 。 它是类型化的 XML 变量,因为它指定了架构命名空间集合名称 ManuInstructionsSchemaCollection

在该示例中,首先将生产说明文档分配给此变量,然后使用 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 子句只选择 ProductDescription 表中符合根据 CatalogDescription xml 类型列指定的条件的那些行 。

  • 如果 XML 不包括任何 <Specifications> 元素,则 WHERE 子句中的 exist() 方法返回 1 (True)。 请注意 not() 函数 (XQuery) 的使用方法。

  • sql:column() 函数 (XQuery) 用于从非 XML 列中引入值。

  • 此查询返回一个空的行集。

此查询指定 xml 数据类型的 query() 和 exist() 方法,并且这两种方法在查询 prolog 中声明了相同的命名空间 。 在本例中,可能需要使用 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)