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
傳回單一或空序列,當類型符合指定的 SequenceType
時Expression
,instance 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。
下列查詢會使用布爾 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>