Wyrażenia SequenceType (XQuery)
W XQuery wartość jest zawsze sekwencji.Typ wartości jest zwany typu sekwencji.Typ sekwencji mogą być używane w instance of XQuery wyrażenie.Składnia SequenceType opisane w specyfikacji XQuery jest używana, gdy trzeba odwoływać się do typu w XQuery wyrażenie.
Nazwa typu niepodzielny można również w cast as XQuery wyrażenie.W SQL Server, instance of i cast as XQuery wyrażeń na SequenceTypes są obsługiwane częściowo.
wystąpienie operatora
instance of Operator może być używany do określenia dynamicznego, lub uruchom -czas, wpisz wartość określonego wyrażenie.Na przykład:
Expression instance of SequenceType[Occurrence indicator]
Należy zauważyć, że instance of operator, Occurrence indicator, określa Kardynalność liczbę elementów w wynikowym sekwencji.Jeżeli nie jest określony, przyjmowana jest kardynalność 1.W SQL Server, znak zapytania (?) wskaźnik wystąpienie jest obsługiwany.? Wskaźnik wystąpienia wskazuje, że Expression można zwrócić zero lub jeden element.Jeśli ? wskaźnik wystąpienie jest określony, instance of zwraca wartość True, kiedy Expression pasuje do określonego typu SequenceType, niezależnie od tego, czy Expression zwraca pojedyncza lub puste sekwencji.
Jeśli ? wskaźnik wystąpienia nie jest określony, sequence of zwraca wartość True tylko wtedy, gdy Expression Wpisz odpowiada Type określonych i Expression zwraca singleton.
Uwaga plus symbol (+) i gwiazdka (*) wskaźniki wystąpienie nie są obsługiwane w SQL Server.
Poniższe przykłady ilustrują użycieinstance of XQuery operator.
Przykład A
Poniższy przykład tworzy xml wpisz zmienną i określa kwerenda na typie.Określa wyrażenie kwerendy instance of operator, aby ustalić, czy dynamiczne typ wartości zwracanej przez pierwszego operandu zgodny z typem określonym w drugi operand.
Następująca kwerenda zwraca True, ponieważ 125 wartość jest wystąpienie określonego typu xs:integer:
declare @x xml
set @x=''
select @x.query('125 instance of xs:integer')
go
Następująca kwerenda zwraca wartość True, ponieważ wartość zwrócona przez wyrażenie, /a [1], w pierwszym argumentem jest elementem:
declare @x xml
set @x='<a>1</a>'
select @x.query('/a[1] instance of element()')
go
Podobnie instance of zwraca wartość True w następującej kwerendzie, ponieważ atrybut jest typ wartości wyrażenie pierwszego wyrażenie:
declare @x xml
set @x='<a attr1="x">1</a>'
select @x.query('/a[1]/@attr1 instance of attribute()')
go
W poniższym przykładzie wyrażenie, data(/a[1], zwraca niepodzielny wartość, która jest wpisana jako xdt:untypedAtomic.Dlatego instance of zwraca wartość True.
declare @x xml
set @x='<a>1</a>'
select @x.query('data(/a[1]) instance of xdt:untypedAtomic')
go
W następującej kwerendzie wyrażenie, data(/a[1]/@attrA, zwraca bez niepodzielny wartości.Dlatego instance of zwraca wartość True.
declare @x xml
set @x='<a attrA="X">1</a>'
select @x.query('data(/a[1]/@attrA) instance of xdt:untypedAtomic')
go
Przykład B
W tym przykładzie wykonywana jest kwerenda maszynowy XML kolumna w AdventureWorks2008R2 przykładowej bazy danych.kolekcja schematu XML skojarzony z kolumna jest poszukiwanych zawiera wpisywania informacji.
W wyrażenie, data() zwraca wartość atrybut ProductModelID, którego typ jest xs:ciąg zgodnie ze schematem skojarzone z kolumna.Dlatego instance of zwraca wartość 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
Aby uzyskać więcej informacji, zobacz XML wpisywanych w porównaniu do pliku XML bez typu.Aby uzyskać informacje dotyczące kolekcja schematu XML skojarzony z kolumna CatalogDescription, zobacz Informacje o kolumnie xml ProductModel.CatalogDescription.
Następujące kwerendy użyj wartość logiczna instance of wyrażenie, czy atrybut LocationID jest typu 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
Określono następujące kwerendy przeciwko CatalogDescription wpisane XML kolumna.kolekcja schematu XML skojarzona kolumna ta zawiera informacje wpisywania.Aby uzyskać więcej informacji na temat kolekcja schematu XML, zobacz Informacje o kolumnie xml ProductModel.CatalogDescription.
W kwerendzie użyto element(ElementName, ElementType?) przetestować w instance of wyrażenie, aby sprawdzić, czy /PD:ProductDescription[1] zwraca węzeł elementu określonej nazwy i typu.
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
Kwerenda zwraca wartość True.
Przykład C
Podczas korzystania z typów Unii instance of wyrażenie w SQL Server ma ograniczenie: W szczególności, gdy typ element lub atrybut jest typu Unii instance of nie może określić dokładny typ.W związku z tym kwerenda zwróci FAŁSZ, chyba że niepodzielny typów używanych w SequenceType jest najwyższym nadrzędnym rzeczywisty typ wyrażenie w hierarchii simpleType.Oznacza to, że niepodzielny typów określonych w SequenceType musi być bezpośredni element podrzędność anySimpleType.Aby uzyskać informacje o hierarchii typów, zobacz Typ rzutowania reguł w XQuery.
W następnym przykładzie kwerendy wykonuje następujące czynności:
Utworzyć kolekcja schematu XML typu Unii, takie jak liczba całkowita lub typu ciąg, określonego w nim.
Zadeklarować maszynowy xml zmiennej przy użyciu kolekcja schematu XML.
Przypisywanie przykładowy plik XML wystąpienie do zmiennej.
Zmienna, aby zilustrować kwerendy instance of zachowanie podczas zajmowania się typu Unii.
To jest kwerenda:
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
Następująca kwerenda zwraca FAŁSZ, ponieważ SequenceType określone w instance of wyrażenie jest nie najwyższy nadrzędnego rzeczywisty typ określonego wyrażenia.Oznacza to, że wartość <TestElement> jest typu Liczba całkowita.Najwyższy nadrzędny jest xs:decimal.Jednakże nie jest określony jako drugi argument instance of operator.
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
Ponieważ nadrzędnego najwyższego xs:integer, xs:decimal, kwerenda będzie zwracać wartość PRAWDA jeśli zmodyfikować kwerendę i określić xs:decimal jako SequenceType w kwerendzie.
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
Przykład D
W tym przykładzie najpierw utworzyć kolekcja schematu XML i używać go do wpisz xml zmiennej.Pismo xml zmienna jest następnie proszeni o ilustrują instance of funkcji.
Następujące kolekcja schematu XML definiuje typ prosty, myType i elementu, <root>, z myType typu:
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
Teraz utworzyć maszynowy xml zmienną i jej kwerendy:
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
Ponieważ typ myType pochodzi przez ograniczenie typu varchar, który jest zdefiniowany w schemacie właściwości sqltypes, instance of także zwróci wartość 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
Przykład E
W poniższym przykładzie wyrażenie pobiera wartości atrybut IDREFS i używa instance of do ustalenia, czy wartość jest typu IDREF.Przykład wykonuje następujące czynności:
Tworzy kolekcja schematu XML, w którym <Customer> element ma OrderList atrybut typu IDREFS oraz <Order> element ma IDZamówienia identyfikator atrybutu type.
Tworzy maszynowy xml zmienną i przypisuje przykładowym kodzie XML wystąpienie do niej.
Określa zapytanie zmiennej.Wyrażenie kwerendy pobiera pierwszą wartość Identyfikator zamówienia z OrderList IDRERS atrybut typu pierwszy <Customer>.Wartość pobierana jest typu IDREF.Dlatego instance of zwraca wartość 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
Ograniczenia wdrażania
Są następujące ograniczenia:
schema-element() i schema-attribute() sekwencji nie są obsługiwane dla porównania do instance of operator.
Na przykład pełnej sekwencji, (1,2) instance of xs:integer*, nie są obsługiwane.
W przypadku korzystania z formularza element() , który określa nazwę typu, takie jak typ sekwencji element(ElementName, TypeName), typ musi być kwalifikowany znakiem zapytania (?).For example, element(Title, xs:string?) indicates that the element might be null.SQL Server does not support run-time detection of the xsi:nil property by using instance of.
Jeśli wartość w Expression pochodzi z element lub atrybut wpisana jako Unii, SQL Server można tylko identyfikować pierwotny, nie pochodzi, typ, z którego pochodzi typ wartości.Na przykład jeśli <e1> zdefiniowane do typu statycznego (xs:integer | xs:ciąg), następujące zwróci False.
data(<e1>123</e1>) instance of xs:integer
Jednakże data(<e1>123</e1>) instance of xs:decimal zwróci wartość True.
Dla processing-instruction() i document-node() są dozwolone typy sekwencji tylko formularze bez argumentów.Na przykład processing-instruction() jest dozwolona, ale processing-instruction('abc') nie jest dozwolona.
oddane jako Operator
cast as wyrażenie mogą być używane do konwersji wartości typu danych.Na przykład:
Expression cast as AtomicType?
W SQL Server, znak zapytania (?) jest wymagana po AtomicType.Na przykład, jak pokazano w następującej kwerendzie "2" cast as xs:integer? konwertuje wartość ciąg na liczbę całkowitą:
declare @x xml
set @x=''
select @x.query('"2" cast as xs:integer?')
W następującej kwerendzie data() zwraca wartość wpisaną wartość atrybut ProductModelID typu ciąg.cast asOperator konwertuje wartość na 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
Jawne użycie data() nie jest wymagany w kwerendzie.cast as Wyrażenie wykonuje pośrednie Atomizacja w wejściowy wyrażenia.
Funkcji konstruktora
Można użyć funkcji konstruktora typu niepodzielny.Na przykład, zamiast cast as operator, "2" cast as xs:integer?, można użyć xs:integer() funkcja konstruktora, jak w następującym przykładzie:
declare @x xml
set @x=''
select @x.query('xs:integer("2")')
Poniższy przykład zwraca xs:data wartość równą 2000-01-01Z.
declare @x xml
set @x=''
select @x.query('xs:date("2000-01-01Z")')
Za pomocą konstruktory niepodzielny typów zdefiniowanych przez użytkownika.Na przykład, jeśli kolekcja schematu XML skojarzony z typem danych XML definiuje typ prosty myType() Konstruktora służą do zwracają wartość tego typu.
Ograniczenia wdrażania
Wyrażenia XQuery typeswitch, castable, i treat nie są obsługiwane.
cast as wymaga znak zapytania (?)Po określeniu typu niepodzielny.
xs:QName nie jest obsługiwany jako typ rzutowania.Użyj expanded-QName zamiast.
xs:date, xs:time, i xs:datetime wymagają czas strefy, który jest wskazywany przez Z.
Następujące kwerendy nie powiedzie się, ponieważ czas strefy nie jest określony.
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25")}</a>') go
Dodając z czas strefy wskaźnik na wartość, kwerenda działa.
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25Z")}</a>') go
Jest to wynikiem:
<a>2002-05-25Z</a>