表达式上下文和查询计算 (XQuery)

表达式的上下文是用于分析和计算表达式的信息。下面是计算 XQuery 的两个阶段:

  • 静态上下文 – 这是查询编译阶段。根据可用信息,有时会在对查询进行静态分析过程中产生错误。
  • 动态上下文 – 这是查询执行阶段。即使查询没有静态错误(如在查询编译过程中产生的错误),查询也可能在执行过程中返回错误。

静态上下文

静态上下文初始化指的是将有关对表达式进行的静态分析的所有信息放在一起的过程。在静态上下文初始化中,要完成下列内容:

  • 将“边界空格”策略设置为 strip。这样,在查询中,any elementattribute 构造函数不保留边界空格。例如:

    declare @x xml
    set @x=''
    select @x.query('<a>  {"Hello"}  </a>,
    
        <b> {"Hello2"}  </b>')
    

    此查询返回以下结果,得到这种结果是因为在分析 XQuery 表达式过程中删除了边界空格:

    <a>Hello</a><b>Hello2</b>
    
  • 为下列内容初始化前缀和命名空间绑定:

    • 一组预定义的命名空间。

    • 使用 WITH XMLNAMESPACES 定义的所有命名空间。有关详细信息,请参阅使用 WITH XMLNAMESPACES 添加命名空间

    • 查询 Prolog 中定义的所有命名空间。请注意,Prolog 中的命名空间声明可覆盖 WITH XMLNAMESPACES 中的命名空间声明。例如,在下面的查询中,WITH XMLNAMESPACES 声明了绑定到命名空间 (http://someURI) 的前缀 (pd)。但是,在 WHERE 子句中,查询 Prolog 覆盖该绑定。

      WITH XMLNAMESPACES ('http://someURI' AS pd)
      SELECT ProductModelID, CatalogDescription.query('
          <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[(pd:Specifications)]'
          ) = 1
      

    所有这些命名空间绑定都在静态上下文初始化过程中解析。

  • 如果查询类型化的 xml 列或变量,将与该列或变量关联的 XML 架构集合的组件导入到静态上下文中。有关详细信息,请参阅类型化与非类型化的 XML

  • 对于导入架构中的每个原子类型,也可在静态上下文中使用转换函数。下面的示例说明了这一点。在此示例中,针对类型化的 xml 变量指定了查询。与此变量关联的 XML 架构集合定义了原子类型 myType。在静态分析过程中可以使用与此类型相对应的转换函数 myType()。查询表达式 (ns:myType(0)) 返回 myType 类型的值。

    -- DROP XML SCHEMA COLLECTION SC
    -- go
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="myNS" xmlns:ns="myNS"
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
          <simpleType name="myType">
                <restriction base="int">
                 <enumeration value="0" />
                  <enumeration value="1"/>
                </restriction>
          </simpleType>
          <element name="root" type="ns:myType"/>
    </schema>'
    go
    
    DECLARE @var XML(SC)
    SET @var = '<root xmlns="myNS">0</root>'
    -- specify myType() casting function in the query
    SELECT @var.query('declare namespace ns="myNS"; ns:myType(0)')
    

    以下示例中,在表达式中指定了用于 int 内置 XML 类型的转换函数。

    declare @x xml
    set @x = ''
    select @x.query('xs:int(5)')
    go
    

初始化静态上下文后,将分析(编译)查询表达式。静态分析涉及以下内容:

  1. 查询分析。

  2. 解析在表达式中指定的函数和类型名称。

  3. 对查询执行静态类型化。这可确保查询类型安全。例如,下面的查询返回静态错误,因为 + 运算符要求 numeric primitive 类型参数。

    declare @x xml
    set @x=''
    SELECT @x.query('"x" + 4')
    

    在以下示例中,value() 运算符要求单一参数。按照 XML 架构中的说明,可以有多个 <Elem> 元素。对表达式进行的静态分析确定它是非类型安全,并返回静态错误。若要解决该错误,必须重写表达式以显式指定单一参数 (data(/x:Elem)[1])。

    DROP XML SCHEMA COLLECTION SC
    go
    CREATE XML SCHEMA COLLECTION SC AS '<schema xmlns="http://www.w3.org/2001/XMLSchema" 
    targetNamespace="myNS" xmlns:ns="myNS"
    xmlns:s="https://schemas.microsoft.com/sqlserver/2004/sqltypes">
          <import namespace="https://schemas.microsoft.com/sqlserver/2004/sqltypes"/>
          <element name="Elem" type="string"/>
    </schema>'
    go
    
    declare @x xml (SC)
    set @x='<Elem xmlns="myNS">test</Elem><Elem xmlns="myNS">test2</Elem>'
    SELECT @x.value('declare namespace x="myNS"; data(/x:Elem)[1]','varchar(20)')
    

    有关详细信息,请参阅 XQuery 与静态类型化

实现限制

下面是与静态上下文有关的限制:

  • 不支持 XPath 兼容模式。
  • 对于 XML 构造,仅支持 strip 构造模式。这是默认设置。因此,已构造元素节点的类型为 xdt:untyped 类型,并且属性为 xdt:untypedAtomic 类型。
  • 仅支持 ordered 排序模式。
  • 仅支持 strip XML 空格策略。
  • 不支持基准 URI 功能。
  • 不支持 fn:doc()
  • 不支持 fn:collection()
  • 不提供 XQuery 静态标记。
  • 使用与 xml 数据类型关联的排序规则。在 SQL Server 2005 中,排序规则始终设置为 Unicode 码位排序规则。

动态上下文

动态上下文指的是在执行表达式时必须可用的信息。除了静态上下文以外,在动态上下文初始化中,还要完成下列内容:

  • 初始化上下文项、上下文位置和上下文大小等表达式的主要项,如下所示。请注意,所有这些值都可由 nodes() 方法覆盖。
    • xml 数据类型将上下文项(正在处理的节点)设置为文档节点。
    • 上下文位置(即上下文项相对于正在处理的节点的位置)首先设置为 1。
    • 上下文大小(正在处理的序列中的项数)首先设置为 1,因为始终有一个文档节点。

实现限制

下面是与动态上下文有关的限制:

  • 不支持“当前日期和时间”上下文函数 fn:current-datefn:current-timefn:current-dateTime
  • implicit timezone 固定为 UTC+0,不能更改。
  • 不支持 fn:doc() 函数。所有查询都针对 xml 类型列或变量执行。
  • 不支持 fn:collection() 函数。

请参阅

参考

管理服务器上的 XML 架构集合

概念

XQuery 基础知识
类型化与非类型化的 XML

帮助和信息

获取 SQL Server 2005 帮助