共用方式為


SequenceType 運算式 (XQuery)

適用於:SQL Server

在 XQuery 中,值一律為序列。 值的型別稱為時序類型。 序列類型可用於 XQuery 運算式的 實例。 當您需要參考 XQuery 運算式中的類型時,會使用 XQuery 規格中所述的 SequenceType 語法。

不可部分完成的類型名稱也可以在轉型中 當做 XQuery 運算式使用。 在 SQL Server 中, 部分支援在 SequenceType 上將 轉換成 XQuery 運算式的實例

運算子的實例

運算子的 實例可用來判斷指定運算式值的動態或執行時間類型。 例如:

  
Expression instance of SequenceType[Occurrence indicator]  

請注意, instance of 運算子 , Occurrence indicator 會指定結果序列中的基數、專案數。 如果未指定此專案,則會假設基數為 1。 在 SQL Server 中,僅支援問號 ( ?) 出現指標。 出現指標表示 Expression 可以傳回零或一個專案。 如果指定了 ? 出現指標,則不論是否 Expression 傳回單一或空序列,當類型符合指定的 SequenceTypeExpressioninstance of 就會傳回 True。

如果未指定 ? 出現指標, sequence of 則只有在類型符合 Type 指定的 且 Expression 傳回單一時 Expression ,才會傳回 True。

注意 SQL Server 不支援加號 ( + ) 和星號 ( * ) 出現指標。

下列範例說明 如何使用 XQuery 運算子的 實例。

範例 A

下列範例會 建立 xml 類型變數,並針對它指定查詢。 查詢運算式會指定運算子,以判斷第一個運算元所傳回之值的動態類型是否符合第二個 instance of 運算元中指定的類型。

下列查詢會傳回 True,因為 125 值是指定類型的 實例 xs:integer

declare @x xml  
set @x=''  
select @x.query('125 instance of xs:integer')  
go  

下列查詢會傳回 True,因為第一個運算元中運算式 /a[1]傳回的值是元素:

declare @x xml  
set @x='<a>1</a>'  
select @x.query('/a[1] instance of element()')  
go  

同樣地, instance of 在下列查詢中傳回 True,因為第一個運算式中的運算式數值型別是屬性:

declare @x xml  
set @x='<a attr1="x">1</a>'  
select @x.query('/a[1]/@attr1 instance of attribute()')  
go  

在下列範例中,運算式 data(/a[1] 會傳回類型為 xdt:untypedAtomic 的不可部分完成值。 因此,會 instance of 傳回 True。

declare @x xml  
set @x='<a>1</a>'  
select @x.query('data(/a[1]) instance of xdt:untypedAtomic')  
go  

在下列查詢中,運算式 data(/a[1]/@attrA 會傳回不具類型的不可部分完成值。 因此,會 instance of 傳回 True。

declare @x xml  
set @x='<a attrA="X">1</a>'  
select @x.query('data(/a[1]/@attrA) instance of xdt:untypedAtomic')  
go  

範例 B

在此範例中,您要查詢 AdventureWorks 範例資料庫中具類型的 XML 資料行。 與所查詢之資料行相關聯的 XML 架構集合會提供輸入資訊。

在運算式中, data() 會根據與資料行相關聯的架構,傳回 ProductModelID 屬性的類型為 xs:string 的具型別值。 因此,會 instance of 傳回 True。

SELECT CatalogDescription.query('  
   declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
   data(/PD:ProductDescription[1]/@ProductModelID) instance of xs:string  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID = 19  

如需詳細資訊,請參閱 比較具類型的 XML 與不具類型的 XML

下列查詢會使用Boolean instance of 運算式來判斷 LocationID 屬性是否為 xs:integer 類型:

SELECT Instructions.query('  
   declare namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";  
   /AWMI:root[1]/AWMI:Location[1]/@LocationID instance of attribute(LocationID,xs:integer)  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID=7  

下列查詢是針對 CatalogDescription 類型的 XML 資料行所指定。 與此資料行相關聯的 XML 架構集合提供輸入資訊。

查詢會 element(ElementName, ElementType?) 使用運算式中的 instance of 測試來確認 傳 /PD:ProductDescription[1] 回特定名稱和類型的專案節點。

SELECT CatalogDescription.query('  
     declare namespace PD="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription";  
     /PD:ProductDescription[1] instance of element(PD:ProductDescription, PD:ProductDescription?)  
    ') as Result  
FROM  Production.ProductModel  
where ProductModelID=19  

查詢會傳回 True。

範例 C

使用等位型別時,SQL Server 中的運算式有限制:具體來說, instance of 當專案或屬性的類型是等位型別時, instance of 可能不會判斷確切的類型。 因此,除非 SequenceType 中使用的不可部分完成類型是 simpleType 階層中運算式實際類型的最高父代,否則查詢會傳回 False。 也就是說,SequenceType 中指定的不可部分完成類型必須是 anySimpleType 的直接子系。 如需類型階層的相關資訊,請參閱 XQuery 中的類型轉換規則。

下一個查詢範例會執行下列動作:

  • 建立具有等位型別的 XML 架構集合,例如其中定義的整數或字串類型。

  • 使用 XML 架構集合宣告具類型的 XML 變數。

  • 將範例 XML 實例指派給 變數。

  • 查詢變數,以說明 instance of 處理等位型別時的行為。

此查詢如下:

CREATE XML SCHEMA COLLECTION MyTestSchema AS '  
<schema xmlns="http://www.w3.org/2001/XMLSchema" targetNamespace="http://ns" xmlns:ns="http://ns">  
<simpleType name="MyUnionType">  
<union memberTypes="integer string"/>  
</simpleType>  
<element name="TestElement" type="ns:MyUnionType"/>  
</schema>'  
Go  

下列查詢會傳回 False,因為運算式中指定的 instance of SequenceType 不是指定之運算式之實際類型的最高父代。 也就是說,的值 <TestElement> 是整數型別。 最高父系為 xs:decimal。 不過,它未指定為 運算子的第二個運算元 instance of

SET QUOTED_IDENTIFIER ON  
DECLARE @var XML(MyTestSchema)  
  
SET @var = '<TestElement xmlns="http://ns">123</TestElement>'  
  
SELECT @var.query('declare namespace ns="http://ns"   
   data(/ns:TestElement[1]) instance of xs:integer')  
go  

因為 xs:integer 的最高父系是 xs:decimal,因此如果您修改查詢,並將 xs:decimal 指定為查詢中的 SequenceType,查詢會傳回 True。

SET QUOTED_IDENTIFIER ON  
DECLARE @var XML(MyTestSchema)  
SET @var = '<TestElement xmlns="http://ns">123</TestElement>'  
SELECT @var.query('declare namespace ns="http://ns"     
   data(/ns:TestElement[1]) instance of xs:decimal')  
go  

範例 D

在此範例中,您會先建立 XML 架構集合,並使用它來輸入 xml 變數。 接著會查詢具類型的 xml 變數,以說明 instance of 功能。

下列 XML 架構集合會定義類型 myType 的簡單類型 myType 和元素 <root> :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="s:varchar">  
                  <maxLength value="20"/>  
            </restriction>  
      </simpleType>  
      <element name="root" type="ns:myType"/>  
</schema>'  
Go  

現在建立具類型的 xml 變數並加以查詢:

DECLARE @var XML(SC)  
SET @var = '<root xmlns="myNS">My data</root>'  
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";  
declare namespace ns="myNS";   
   data(/ns:root[1]) instance of ns:myType')  
go  

因為 myType 類型衍生自 sqltypes 架構中所定義的 Varchar 類型限制, instance of 因此也會傳回 True。

DECLARE @var XML(SC)  
SET @var = '<root xmlns="myNS">My data</root>'  
SELECT @var.query('declare namespace sqltypes = "https://schemas.microsoft.com/sqlserver/2004/sqltypes";  
declare namespace ns="myNS";   
data(/ns:root[1]) instance of sqltypes:varchar?')  
go  

範例 E

在下列範例中,運算式會擷取其中一個 IDREFS 屬性值,並使用 instance of 來判斷值是否為 IDREF 類型。 此範例會執行下列動作:

  • 建立 XML 架構集合, <>Customer 其中專案具有 OrderList IDREFS 類型屬性,而 >Order< 專案具有 OrderID ID 類型屬性。

  • 建立具類型的 xml 變數,並將範例 XML 實例指派給它。

  • 指定變數的查詢。 查詢運算式會擷取第一個 之 OrderList BNERS 類型屬性中的第一個 <Customer> 訂單識別碼值。 擷取的值是 IDREF 類型。 因此, instance of 會傳回 True。

create xml schema collection SC as  
'<schema xmlns="http://www.w3.org/2001/XMLSchema" xmlns:Customers="Customers" targetNamespace="Customers">  
            <element name="Customers" type="Customers:CustomersType"/>  
            <complexType name="CustomersType">  
                        <sequence>  
                            <element name="Customer" type="Customers:CustomerType" minOccurs="0" maxOccurs="unbounded" />  
                        </sequence>  
            </complexType>  
             <complexType name="OrderType">  
                <sequence minOccurs="0" maxOccurs="unbounded">  
                            <choice>  
                                <element name="OrderValue" type="integer" minOccurs="0" maxOccurs="unbounded"/>  
                            </choice>  
                </sequence>                                             
                <attribute name="OrderID" type="ID" />  
            </complexType>  
  
            <complexType name="CustomerType">  
                <sequence minOccurs="0" maxOccurs="unbounded">  
                            <choice>  
                                <element name="spouse" type="string" minOccurs="0" maxOccurs="unbounded"/>  
                                <element name="Order" type="Customers:OrderType" minOccurs="0" maxOccurs="unbounded"/>  
                            </choice>  
                </sequence>                                             
                <attribute name="CustomerID" type="string" />  
                <attribute name="OrderList" type="IDREFS" />  
            </complexType>  
 </schema>'  
go  
declare @x xml(SC)  
set @x='<CustOrders:Customers xmlns:CustOrders="Customers">  
                <Customer CustomerID="C1" OrderList="OrderA OrderB"  >  
                              <spouse>Jenny</spouse>  
                                <Order OrderID="OrderA"><OrderValue>11</OrderValue></Order>  
                                <Order OrderID="OrderB"><OrderValue>22</OrderValue></Order>  
  
                </Customer>  
                <Customer CustomerID="C2" OrderList="OrderC OrderD" >  
                                <spouse>John</spouse>  
                                <Order OrderID="OrderC"><OrderValue>33</OrderValue></Order>  
                                <Order OrderID="OrderD"><OrderValue>44</OrderValue></Order>  
  
                        </Customer>  
                <Customer CustomerID="C3"  OrderList="OrderE OrderF" >  
                                <spouse>Jane</spouse>  
                                <Order OrderID="OrderE"><OrderValue>55</OrderValue></Order>  
                                <Order OrderID="OrderF"><OrderValue>55</OrderValue></Order>  
                </Customer>  
                <Customer CustomerID="C4"  OrderList="OrderG"  >  
                                <spouse>Tim</spouse>  
                                <Order OrderID="OrderG"><OrderValue>66</OrderValue></Order>  
                        </Customer>  
                <Customer CustomerID="C5"  >  
                </Customer>  
                <Customer CustomerID="C6" >  
                </Customer>  
                <Customer CustomerID="C7"  >  
                </Customer>  
</CustOrders:Customers>'  
  
select @x.query(' declare namespace CustOrders="Customers";   
 data(CustOrders:Customers/Customer[1]/@OrderList)[1] instance of xs:IDREF ? ') as XML_result  

實作限制

以下是限制:

  • 相較于 運算子,不支援 instance of schema-element() schema-attribute() 序列類型。

  • 不支援完整序列, (1,2) instance of xs:integer* 例如 。

  • 當您使用指定類型名稱的 element() 序列類型形式時,類型 element(ElementName, TypeName) 必須以問號 (?) 限定。 例如, element(Title, xs:string?) 表示專案可能是 Null。 SQL Server 不支援使用 instance of 偵測 xsi:nil 屬性的執行時間。

  • 如果 中的 Expression 值來自類型為等位的專案或屬性,SQL Server 只能識別衍生值型別的來源基本型別,而非衍生型別。 例如,如果 <e1> 定義為具有靜態類型 (xs:integer | xs:string),下列會傳回 False。

    data(<e1>123</e1>) instance of xs:integer  
    

    不過, data(<e1>123</e1>) instance of xs:decimal 會傳回 True。

  • 對於 processing-instruction() document-node() 序列類型,只允許沒有引數的表單。 例如, processing-instruction() 是允許的,但 processing-instruction('abc') 不允許。

轉型為運算子

轉換 運算式可用來將值轉換成特定資料類型。 例如:

  
Expression cast as  AtomicType?  

在 SQL Server 中,在 之後 AtomicType 需要問號 (?) 。 例如,如下列查詢所示, "2" cast as xs:integer? 將字串值轉換成整數:

declare @x xml  
set @x=''  
select @x.query('"2" cast as xs:integer?')  

在下列查詢中, data() 會傳回 ProductModelID 屬性的具型別值,這是字串類型。 運算子 cast as 會將值轉換成 xs:integer。

WITH XMLNAMESPACES ('https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelDescription' AS PD)  
SELECT CatalogDescription.query('  
   data(/PD:ProductDescription[1]/@ProductModelID) cast as xs:integer?  
') as Result  
FROM Production.ProductModel  
WHERE ProductModelID = 19  

此查詢中不需要明確使用 data()。 運算式 cast as 會在輸入運算式上執行隱含原子化。

建構函式

您可以使用不可部分完成的類型建構函式。 例如,您可以使用 xs:integer() 建構函式,而不是使用 cast as 運算子, "2" cast as xs:integer? 如下列範例所示:

declare @x xml  
set @x=''  
select @x.query('xs:integer("2")')  

下列範例會傳回等於 2000-01-01Z 的 xs:date 值。

declare @x xml  
set @x=''  
select @x.query('xs:date("2000-01-01Z")')  

您也可以使用使用者定義的不可部分完成類型建構函式。 例如,如果與 XML 資料類型相關聯的 XML 架構集合定義簡單類型, 則可以使用 myType() 建構函式來傳回該類型的值。

實作限制

  • 不支援 XQuery 運算式 類型witch 可轉換 處理

  • 轉型為 需要問號 (?)在不可部分完成類型之後。

  • xs:QName 不支援做為轉型的類型。 請改用 expanded-QName

  • xs:date xs:time xs:datetime 需要時區,以 Z 表示。

    下列查詢失敗,因為未指定時區。

    DECLARE @var XML  
    SET @var = ''  
    SELECT @var.query(' <a>{xs:date("2002-05-25")}</a>')  
    go  
    

    藉由將 Z 時區指標新增至值,查詢就會運作。

    DECLARE @var XML  
    SET @var = ''  
    SELECT @var.query(' <a>{xs:date("2002-05-25Z")}</a>')  
    go  
    

    以下是結果:

    <a>2002-05-25Z</a>  
    

另請參閱

XQuery 運算式
類型系統 (XQuery)