運算式內容和查詢評估 (XQuery)

適用於:SQL Server

運算式的內容是用來分析及評估它的資訊。 以下是評估 XQuery 的兩個階段:

  • 靜態內容 - 這是查詢編譯階段。 根據可用的資訊,有時會在查詢的靜態分析期間引發錯誤。

  • 動態內容 - 這是查詢執行階段。 即使查詢沒有靜態錯誤,例如查詢編譯期間的錯誤,查詢可能會在執行期間傳回錯誤。

靜態內容

靜態內容初始化是指將運算式靜態分析的所有資訊組合在一起的程式。 在靜態內容初始化中,已完成下列專案:

  • 界限 空格 符原則會設定為等量。 因此,查詢中的任何元素 屬性 建構函式不會保留 界限空白字元。 例如:

    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 將命名空間新增至查詢。

    • 查詢初構中定義的任何命名空間。 請注意,初構中的命名空間宣告可能會覆寫 WITH XMLNAMESPACES 中的命名空間宣告。 例如,在下列查詢中,WITH XMLNAMESPACES 會宣告將前置詞 (pd) 系結至命名空間 ( https://someURI )。 不過,在 WHERE 子句中,查詢初構會覆寫系結。

      WITH XMLNAMESPACES ('https://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 變數指定查詢。 與此變數相關聯的 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. 查詢的靜態類型。 這可確保查詢的型別安全。 例如,下列查詢會傳回靜態錯誤,因為 + 運算子需要數值基本類型引數:

    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 建構,僅支援等量建構模式。 這是預設設定。 因此,建構元素節點的類型是 xdt:untyped 型別,而屬性則為 xdt:untypedAtomic 類型。

  • 僅支援已排序的排序模式。

  • 僅支援等量 XML 空間原則。

  • 不支援基底 URI 功能。

  • 不支援 fn:doc()

  • 不支援 fn:collection()

  • 未提供 XQuery 靜態旗標。

  • 使用與 xml 資料類型相關聯的定序。 這個定序一律設定為 Unicode 字碼點定序。

動態內容

動態內容是指在執行運算式時必須提供的資訊。 除了靜態內容之外,下列資訊也會初始化為動態內容的一部分:

  • 運算式焦點,例如內容專案、內容位置和內容大小,會初始化,如下所示。 請注意,這些值都可以由 nodes() 方法 覆寫。

    • xml 資料類型會將 內容專案、正在處理的節點設定為檔節點。

    • 內容位置,相對於所處理節點的內容專案位置,會先設定為 1。

    • 處理順序中的專案數目內容大小會先設定為 1,因為一律有一個檔節點。

實作限制

以下是與動態內容相關的限制:

  • 不支援目前的日期和時間 內容函式 fn:current-date fn:current-time fn:current-dateTime

  • 隱含時區 固定為 UTC+0,無法變更。

  • 不支援 fn:doc() 函式。 所有查詢都會針對 xml 類型資料行或變數執行。

  • 不支援 fn:collection() 函式。

另請參閱

XQuery 基本概念
比較具類型的 XML 與不具類型的 XML
XML 結構描述集合 (SQL Server)