exist() 方法(xml 数据类型)
适用于: SQL Server
Azure SQL 数据库
Azure SQL 托管实例
返回位,表示下列条件之一:
1,表示 True(如果查询中的 XQuery 表达式返回一个非空结果)。 即,它至少返回一个 XML 节点。
0,表示 False(如果它返回一个空结果)。
NULL(如果执行查询的 xml 数据类型实例包含 NULL)。
语法
exist (XQuery)
参数
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)