Udostępnij za pośrednictwem


Typ systemu (XQuery)

XQuery jest jednoznacznie określony język typy schematów i język słabo wpisanych danych bez typu.Następujące wstępnie zdefiniowane typy XQuery:

W tym temacie opisano poniżej:

Wbudowane typy schematu XML

Wbudowane typy schematów XML mają prefiks obszaru nazw wstępnie zdefiniowanych xs.Niektóre z tych typów to xs:integer i xs:ciąg.Obsługiwane są następujące typy wbudowane.Typów tych można używać podczas tworzenia kolekcja schematu XML.

Po wpisaniu XML podczas badania typu statycznych i dynamicznych węzłów zależy od kolekcja schematu XML skojarzony z kolumna lub zmiennej, którego dotyczy kwerenda.Aby uzyskać więcej informacji o typach statycznych i dynamicznych, zobacz Ocena kwerendy (XQuery) i kontekstu wyrażenia.Na przykład, poniższa kwerenda jest określona przeciwko maszynowy xml kolumna (Instructions).wyrażenie Używa instance of , aby sprawdzić, czy wartość wpisaną LotSize jest zwrócony atrybut xs:decimal typu.

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

To wpisując informację kolekcja schematu XML skojarzony z kolumna.Aby uzyskać więcej informacji, zobacz XML reprezentacji typu danych w bazie danych AdventureWorks2008R2.

Typów zdefiniowanych w obszarze nazw typów danych XPath

Typów zdefiniowanych w http://www.w3.org/2004/07/xpath-datatypes obszaru nazw ma wstępnie prefiks xdt.Poniższe informacje dotyczą następujących typów:

  • Podczas tworzenia kolekcja schematu XML nie można użyć tych typów.Te typy są używane w systemie typu XQuery i są używane do XQuery i wpisując statyczne.Na przykład, oddanych do typów niepodzielny xdt:untypedAtomic, xdt obszaru nazw.

  • Podczas badania bez typu XML, statycznych i dynamicznych typ elementu węzłów jest xdt:untyped, i jest typ wartości atrybut xdt:untypedAtomic.Wynik query() Metoda generuje XML bez typu.Oznacza to, że węzłów XML są zwracane jako xdt:untyped i xdt:untypedAtomic, odpowiednio.

  • xdt:dayTimeDuration i xdt:yearMonthDuration nie są obsługiwane.

W następującym przykładzie określono kwerendy przeciwko zmiennej bez typu XML.Wyrażenie, data(/a[1]), zwraca sekwencji jedną wartość niepodzielny.data() Funkcja zwraca wartość elementu <a>.Ponieważ XML poszukiwanych bez typu, zwrócona wartość jest xdt:untypedAtomic.Dlatego instance of zwraca wartość true.

DECLARE @x xml
SET @x='<a>20</a>'
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )

Zamiast pobierać wpisaną wartość wyrażenie (/a[1]) w następującym przykładzie zwraca sekwencja jednego elementu, element <a>.instance of Wyrażenie test element do sprawdzenia wartości zwróconej przez wyrażenie węzeł elementu z 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()')

Ostrzeżenie

Kiedy wykonywana jest kwerenda maszynowy XML wystąpienie i wyrażenie kwerendy obejmuje oś nadrzędna, statyczne informacje wynikowego węzłów nie jest już dostępny.Typ dynamicznego jest jednak nadal skojarzona z węzłów.

Wpisane wartości vs.Wartość ciągu

Każdy węzeł ma wartość wpisaną i wartość ciąg.Wpisane dane XML wpisz wartość wpisaną jest dostarczana przez kolekcja schematu XML skojarzony z kolumna lub zmiennej, którego dotyczy kwerenda.Bez typu danych XML jest typ wartości wpisywanych xdt:untypedAtomic.

Można użyć data() lub string() funkcja, aby pobrać wartość węzła:

W następujących kolekcja schematu XML <root> zdefiniowanych w elemencie typu integer:

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 wartość wpisaną /root[1] , a następnie dodaje 3 do niej

DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')

W kolejnym przykładzie wyrażenie zawiedzie, ponieważ string(/root[1]) wyrażenie zwraca wartość typu ciąg.Wartość ta jest następnie przekazywane operator arytmetyczny, które przyjmuje tylko wartości liczbowe typu jako argumentów.

-- 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ę LaborHours atrybuty.data() funkcja pobiera wartości wpisywanych LaborHours atrybutów ze wszystkich <Location> elementy modelu produktu.Zgodnie ze schematem XML skojarzony z Instruction kolumna, LaborHours jest xs:decimal typu.

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

Ta kwerenda zwraca 12.75 jako wynik.

Ostrzeżenie

Jawne użycie data() w tym przykładzie funkcja wyłącznie jako ilustracja.Jeśli nie zostanie określona, sum() niejawnie stosuje się data() funkcja wyodrębnić wartości wpisywanych węzłów.