Notatka
Dostęp do tej strony wymaga autoryzacji. Może spróbować zalogować się lub zmienić katalogi.
Dostęp do tej strony wymaga autoryzacji. Możesz spróbować zmienić katalogi.
Dotyczy:SQL Server
XQuery to język silnie typowany dla typów schematów oraz słabo typowany język dla danych nietypowanych. Zdefiniowane typy XQuery obejmują:
Wbudowane typy schematów XML w http://www.w3.org/2001/XMLSchema przestrzeni nazw.
Typy zdefiniowane w http://www.w3.org/2004/07/xpath-datatypes przestrzeni nazw.
Ten temat opisuje również następujące rzeczy:
Wartość wpisana w porównaniu do wartości ciągu węzła.
Dopasowywanie typu sekwencji zwracanego przez wyrażenie.
Wbudowane typy schematu XML
Wbudowane typy schematów XML mają prefiks przestrzeni nazw xs. Niektóre z tych typów to xs:integer oraz xs:string. Wszystkie te wbudowane typy są obsługiwane. Możesz używać tych typów, tworząc kolekcję schematów XML.
Podczas zapytań typu XML statyczny i dynamiczny węzłów jest określany przez kolekcję schematów XML powiązaną z kolumną lub zmienną, która jest zapytania. Więcej informacji o typach statycznych i dynamicznych można znaleźć w artykule Expression Context and Query Evaluation (XQuery). Na przykład następujące zapytanie jest określone względem wpisanej kolumny xml (Instructions). Wyrażenie służy instance of do weryfikacji, czy typowa wartość zwróconego atrybutu LotSize jest typu xs:decimal .
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
data(/AWMI:root[1]/AWMI:Location[@LocationID=10][1]/@LotSize)[1] instance of xs:decimal
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
Informacje o typowaniu są dostarczane przez kolekcję schematów XML powiązaną z kolumną.
Typy zdefiniowane w przestrzeni nazw typów danych XPath
Typy zdefiniowane w http://www.w3.org/2004/07/xpath-datatypes przestrzeni nazw mają zdefiniowany prefiks xdt. Następujące zasady dotyczą tych typów:
Nie możesz używać tych typów podczas tworzenia kolekcji schematów XML. Te typy są używane w systemie typów XQuery oraz do typowania XQuery oraz statycznego typowania. Możesz rzucać na typy atomic, na przykład xdt:untypedAtomic, w przestrzeni nazw xdt .
Podczas zapytania XML, statyczny i dynamiczny typ węzłów elementów to xdt:untyped, a typ wartości atrybutów to xdt:untypedAtomic. Wynik metody query() generuje nietypowane XML. Oznacza to, że węzły XML zwracane są odpowiednio jako xdt:untyped oraz xdt:untypedAtomic.
Typy xdt:dayTimeDuration oraz xdt:yearMonthDuration nie są obsługiwane.
W poniższym przykładzie zapytanie jest określone względem nietypowanej zmiennej XML. Wyrażenie ), data(/a[1]zwraca ciąg o wartości atomowej. Funkcja data() zwraca typową wartość elementu <a>. Ponieważ zapytany XML jest nietypowany, typ zwracanej wartości to xdt:untypedAtomic. Dlatego zwraca się instance of prawdziwie.
DECLARE @x xml
SET @x='<a>20</a>'
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )
Zamiast pobierać typową wartość, wyrażenie (/a[1]) w poniższym przykładzie zwraca ciąg jednego elementu, element <a>. Wyrażenie wykorzystuje instance of test elementów, aby zweryfikować, czy wartość zwracana przez wyrażenie jest węzłem elementowym .xdt:untyped type
DECLARE @x xml
SET @x='<a>20</a>'
-- Is this an element node whose name is "a" and type is xdt:untyped.
SELECT @x.query( '/a[1] instance of element(a, xdt:untyped?)')
-- Is this an element node of type xdt:untyped.
SELECT @x.query( '/a[1] instance of element(*, xdt:untyped?)')
-- Is this an element node?
SELECT @x.query( '/a[1] instance of element()')
Uwaga / Notatka
Gdy zapytujesz typową instancję XML i wyrażenie zapytania zawiera oś nadrzędną, statyczne informacje o typie powstałych węzłów nie są już dostępne. Jednak typ dynamiczny nadal jest powiązany z węzłami.
Wartość wpisana vs. wartość ciągu
Każdy węzeł ma wartość typową oraz wartość ciągu znaków. Dla typowanych danych XML typ wpisanej wartości jest dostarczany przez kolekcję schematu XML powiązaną z kolumną lub zmienną, która jest zapytywana. Dla nietypowanych danych XML typ wpisanej wartości to xdt:untypedAtomic.
Możesz użyć funkcji data() lub string(), aby pobrać wartość węzła:
Funkcja danych (XQuery) zwraca typową wartość węzła.
Funkcja ciągu (XQuery) zwraca wartość ciągu węzła.
W poniższej kolekcji schematów XML zdefiniowany jest <root> element typu całkowitoliczbowego:
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root" type="integer"/>
</schema>'
GO
W poniższym przykładzie wyrażenie najpierw pobiera typową wartość , /root[1] a następnie ją dodaje 3 .
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')
W następnym przykładzie wyrażenie nie wychodzi, ponieważ w string(/root[1]) wyrażeniu zwraca wartość typu ciągu znaków. Ta wartość jest następnie przekazywana operatorowi arytmetycznemu, który przyjmuje jedynie wartości typów numerycznych jako swoje operandy.
-- Fails because the argument is string type (must be numeric primitive type).
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('string(/root[1]) + 3')
Poniższy przykład oblicza sumę atrybutów LaborHours . Funkcja data() pobiera typowe wartości LaborHours atrybutów ze wszystkich <Location> elementów modelu produktu. Zgodnie ze schematem XML powiązanym z kolumną Instruction , LaborHours jest typu xs:dziesiętny .
SELECT Instructions.query('
DECLARE namespace AWMI="https://schemas.microsoft.com/sqlserver/2004/07/adventure-works/ProductModelManuInstructions";
sum(data(//AWMI:Location/@LaborHours))
') AS Result
FROM Production.ProductModel
WHERE ProductModelID=7
To zapytanie zwraca wynik 12,75.
Uwaga / Notatka
Jawne użycie funkcji data() w tym przykładzie służy jedynie do ilustracji. Jeśli nie jest określona, sum() domyślnie stosuje funkcję data() do wyodrębnienia typowanych wartości węzłów.