exist() 方法(xml 数据类型)
返回“位”,表示下列条件之一:
- 1,表示 True(如果查询中的 XQuery 表达式返回一个非空结果)。即,它至少返回一个 XML 节点。
- 0,表示 False(如果它返回一个空结果)。
- NULL(如果执行查询的 xml 数据类型实例包含 NULL)。
语法
exist (XQuery)
参数
- XQuery
是一个 XQuery 表达式,字符串文字。
示例
A. 对 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,因为本示例中不支持隐式转换。
B. 对类型化的 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
C. 对 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 DML)
示例 XML 应用程序