Wyrażenia SequenceType (XQuery)
W XQuery wartość jest zawsze sekwencji.Typ wartości jest określane jako typ sekwencji.Typ sekwencji można używać w instance of Wyrażenie XQuery. Składnia SequenceType opisane w specyfikacji XQuery jest używany, gdy trzeba odwołać się do określonego typu w wyrażeniu XQuery.
Nazwa typu niepodzielny można również w cast as Wyrażenie XQuery. W SQL Server, instance of i cast as Wyrażenia XQuery na SequenceTypes częściowo są obsługiwane.
wystąpienie operator
The instance of operator can be used to determine the dynamic, or run-czas, type of the value of the specified wyrażenie. Na przykład:
Expression instance of SequenceType[Occurrence indicator]
Należy zauważyć, że instance of operator, Occurrence indicator, określa relacja, liczba elementów w wynikowym sekwencji. Jeśli nie zostanie określona, relacja zakłada się, że wynosi 1.W SQL Server, tylko na pytanie znaku ()?) wskaźnik wystąpienie jest obsługiwany. The ? occurrence indicator indicates that Expression can return zero or one element. Jeśli ? wskaźnik wystąpienie zostanie określona, instance of Zwraca wartość prawdy, gdy Expression pasuje do określonego typu SequenceType, niezależnie od czy Expression wynikiem jest pojedyncza lub sekwencję puste.
Jeśli ? wskaźnik wystąpienie nie zostanie określona, sequence of Zwraca wartość prawdy tylko wtedy, gdy Expression Wpisz dopasowania Type określony i Expression Zwraca pojedyncza.
Uwaga Ze znakiem plusa (+) i gwiazdki (*) wskaźniki wystąpienia nie są obsługiwane w SQL Server.
Poniższe przykłady ilustrują użycieinstance of Operator XQuery.
Dlatego wartość predykatu prawdziwość to wyrażenie ma wartość true tylko dla węzłów, którego położenie kontekstu jest 3.
Poniższy przykład tworzy xml wpisz zmienną oraz określa kwerendy przed nim. Wyrażenie kwerendy określa instance of operator, aby ustalić, czy dynamiczne typ wartości zwracanej przez pierwszy argument jest zgodny z typem określonym w drugim argumentem.
Następująca kwerenda zwraca wartość 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ść prawdy w następującej kwerendzie, ponieważ typ wartości wyrażenie w pierwszym wyrażenie jest atrybut:
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 wartość niepodzielny wpisany jako xdt:untypedAtomic. Dlatego też instance of Zwraca wartość PRAWDA.
declare @x xml
set @x='<a>1</a>'
select @x.query('data(/a[1]) instance of xdt:untypedAtomic')
go
W następującej kwerendy dla wyrażenie data(/a[1]/@attrA, zwraca wartość niepodzielny bez typu. Dlatego też instance of Zwraca wartość PRAWDA.
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 wpisywanych kolumna XML z przykładowej bazy danych AdventureWorks.kolekcja schematu XML, które są skojarzone z kolumna, która jest poszukiwanych wpisując informacje.
W wyrażeniu data() Zwraca wartość wpisaną wartość atrybut ProductModelID, którego typem danych jest xs:ciąg zgodnie ze schematem skojarzonych z kolumna. Dlatego też instance of Zwraca wartość PRAWDA.
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 zobaczTyped XML Compared to Untyped XML.Aby uzyskać informacje dotyczące kolekcja schematu XML, które są skojarzone z kolumną CatalogDescription zobacz About the ProductModel.CatalogDescription xml Column.
The following queries usethelogiczny instance of wyrażenie to determine whether the LocationID atrybut is of xs:integer type:
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
W następującej kwerendzie zostanie określona przed CatalogDescription wpisywanych kolumna XML.kolekcja schematu XML, skojarzona kolumna ta zawiera informacje pisania.Aby uzyskać więcej informacji na temat kolekcja schematu XML zobacz About the ProductModel.CatalogDescription xml Column.
W kwerendzie użyto element(ElementName, ElementType?) Testowanie w instance of wyrażenie, aby sprawdzić, czy /PD:ProductDescription[1] Zwraca węzeł elementu o określonej nazwie i typie.
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
Zwraca wartość PRAWDA.
Ten predykat wartość wartość typu logiczny.
Podczas korzystania z typów Sumuj, instance of wyrażenie w SQL Server ma to ograniczenie: W szczególności, gdy typ element lub atrybut jest typu składającej instance of nie może ustalić typu dokładne. W związku z tym kwerenda zwróci FAŁSZ, chyba że niepodzielny używanych w SequenceType typów jest najwyższy element nadrzędny rzeczywisty typ wyrażenie w hierarchii simpleType.Oznacza to niepodzielny typów wymienionych w SequenceType musi być bezpośrednim elementem podrzędnym anySimpleType.Aby uzyskać informacje na temat hierarchii typów zobacz Typ rzutowania reguły powodujące XQuery.
W następnym przykładzie kwerendy wykonuje następujące czynności:
Utwórz kolekcja schematu XML składającej typu, takie jak liczba całkowita lub typu ciąg znaków, zdefiniowanego w nim.
Zadeklarować maszynowy xml Zmienna, za pomocą kolekcja schematu XML.
Instancja XML przykładowe można przypisać do zmiennej.
Kwerendy zmiennej do zilustrowania instance of zachowanie podczas zajmowania się związków typu.
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 wartość false, ponieważ SequenceType określone w instance of wyrażenie nie jest najwyższym nadrzędnym rzeczywisty typ określonego wyrażenia. Oznacza to, wartość <TestElement> jest to typ liczby całkowitej. Najwyższy nadrzędny jest xs:decimal.Jednak nie został określony jako drugi operand do 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ż najwyższy element nadrzędny xs:integer xs:decimal, kwerenda zwróci wartość true, jeśli należy 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, należy najpierw utworzyć kolekcja schematu XML i umożliwia wpisanie xml Zmienna. Maszynowy xml Zmienna jest następnie kierowane kwerendy w celu zilustrowania instance of funkcje.
Określa następujące kolekcja schematu XML typu prostego, 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 Zmienna i jego 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ż myType typu uzyskuje się przez ograniczenie typu varchar, która jest zdefiniowana w schemacie sqltypes instance of również 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 jedną z wartości atrybut IDREFS pobiera i wykorzystuje instance of Aby określić, czy wartość typu IDREF. Jeśli jest mieszaniną tego typu lub inne wartości z innych typów są przekazywane, błąd statycznego zostanie zaokrąglona.
Tworzy kolekcja schematu XML, w którym <Customer> element ma OrderList Atrybut typu IDREFS, i <Order> elementu Identyfikator zamówienia Atrybut typu ID.
Tworzy maszynowy XML zmienna i przypisuje próbki XML wystąpienie do niego.
Określa kwerendy wobec tej zmiennej.Wyrażenie kwerendy pobiera pierwszą wartość Identyfikator zamówienia z atrybut typu IDRERS OrderList pierwszego <Customer>. Wartość pobierana jest typu IDREF.Dlatego też instance of Zwraca wartość PRAWDA.
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
defaultButton
Ograniczenia są następujące:
The schema-element() and schema-attribute() sequence types are not supported for comparison to the instance of operator.
Pełne sekwencji, na przykład (1,2) instance of xs:integer*, nie są obsługiwane.
W przypadku korzystania z formularza element() Określa nazwę, typ, takie jak typ sekwencji element(ElementName, TypeName), typem 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 jedynie określić podstawowy, nie pochodzi, wpisz z którego pochodzi typem tej wartości. Na przykład jeśli <e1> Określa się do typu statycznego (xs:integer | xs:ciąg), następujące zwraca wartość false.
data(<e1>123</e1>) instance of xs:integer
Jednak data(<e1>123</e1>) instance of xs:decimal Zwraca wartość PRAWDA.
Dla processing-instruction() i document-node() typy sekwencji są dozwolone tylko formularze bez argumentów. Na przykład processing-instruction() może, ale processing-instruction('abc') nie jest dozwolone.
Rzutowanie jako operator
The cast as wyrażenie can be used to convert a value to a specific data type. Na przykład:
Expression cast as AtomicType?
W SQL Server, znak zapytania (?) jest wymagany po AtomicType. Na przykład, jak pokazano w następującej kwerendzie "2" cast as xs:integer? Konwertuje wartości ciąg na liczbę całkowitą z zakresu:
declare @x xml
set @x=''
select @x.query('"2" cast as xs:integer?')
W następującej kwerendzie data() Zwraca wartość określonego atrybut ProductModelID, typu ciąg. The cast asoperator converts the value to 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 wymagane w tej kwerendzie. The cast as wyrażenie performs implicit atomization on the input wyrażenie.
Funkcje Konstruktora
Można użyć funkcji konstruktora niepodzielny typu.Na przykład, zamiast używać cast as operator, "2" cast as xs:integer?, można użyć xs:integer() Funkcja konstruktora, podobnie jak w poniższym przykładzie:
declare @x xml
set @x=''
select @x.query('xs:integer("2")')
W poniższym przykładzie zwraca wartość xs równa 2000-01-01Z.
declare @x xml
set @x=''
select @x.query('xs:date("2000-01-01Z")')
Można użyć konstruktorów niepodzielny typów zdefiniowanych przez użytkownika.Na przykład, jeśli kolekcja schematu XML skojarzony z typem danych XML definiuje typ prosty, myType() w celu zwrócenia wartości z tego typu można użyć konstruktora.
defaultButton
Wyrażenia XQuery typeswitch, castable, a treat nie są obsługiwane.
cast as wymaga znak zapytania (?)Po niepodzielny typu.
xs:QName nie jest obsługiwana jako typ rzutowania.Użycie expanded-QName w zamian.
xs:date, xs:time, a xs:datetime wymagają czas strefy, która jest wskazywany przez Z.
Następujące kwerendy nie powiedzie się, ponieważ czas strefa nie została określona.
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25")}</a>') go
Dodając wskaźnik strefy czasowej Z wartości kwerendy działa.
DECLARE @var XML SET @var = '' SELECT @var.query(' <a>{xs:date("2002-05-25Z")}</a>') go
To jest wynik:
<a>2002-05-25Z</a>