System typów (XQuery)

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ą:

Ten temat opisuje również następujące rzeczy:

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:

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.