exist() 方法(xml 数据类型)
返回“位”,表示下列条件之一:
1,表示 True(如果查询中的 XQuery 表达式返回一个非空结果)。即,它至少返回一个 XML 节点。
0,表示 False(如果它返回一个空结果)。
NULL(如果执行查询的 xml 数据类型实例包含 NULL)。
注意 |
---|
对于返回非空结果的 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 (XQuery)
参数
- XQuery
是一个 XQuery 表达式,字符串文字。
示例
以下示例演示如何指定 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