Typový systém (XQuery)

platí pro:SQL Server

XQuery je silně typovaný jazyk pro typy schémat a slabě typovaný jazyk pro netypovaná data. Předdefinované typy XQuery zahrnují následující:

Toto téma také popisuje následující:

Vestavěné typy XML schématu

Vestavěné typy XML schématu mají předdefinovaný prefix jmenného prostoru xs. Mezi tyto typy patří xs:integer a xs:string. Všechny tyto vestavěné typy jsou podporovány. Tyto typy můžete použít při vytváření kolekce XML schémat.

Při dotazování typovaného XML je statický a dynamický typ uzlů určen kolekcí XML schématu přiřazenou ke sloupci nebo proměnné, která je dotazována. Pro více informací o statických a dynamických typech viz Expression Context and Query Evaluation (XQuery). Například následující dotaz je zadán proti typovanému sloupci xml (Instructions). Tento výraz slouží instance of k ověření, že typovaná hodnota vráceného atributu LotSize je typu 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  

Tyto informace o typování jsou poskytovány XML kolekcí schématu přiřazenou ke sloupci.

Typy definované v jmenném prostoru datových typů XPath

Typy definované v http://www.w3.org/2004/07/xpath-datatypes jmenném prostoru mají předdefinovaný prefix xdt. Na tyto typy platí následující:

  • Tyto typy nelze použít, když vytváříte XML schématovou kolekci. Tyto typy se používají v systému XQuery a jsou použity pro XQuery a statické typování. Můžete přenášet na atomické typy, například xdt:untypedAtomic, v jmenném prostoru xdt .

  • Při dotazování netypovaného XML je statický a dynamický typ uzlů prvků xdt:untyped a typ hodnot atributů je xdt:untypedAtomic. Výsledek metody query() generuje netypované XML. To znamená, že XML uzly jsou vráceny jako xdt:untyped a xdt:untypedAtomic.

  • Typy xdt:dayTimeDuration a xdt:yearMonthDuration nejsou podporovány.

V následujícím příkladu je dotaz zadán proti netypované XML proměnné. Výraz data(/a[1]), vrací posloupnost jedné atomové hodnoty. Funkce vrací data() typovanou hodnotu prvku <a>. Protože dotazované XML není typované, typ vrácené hodnoty je xdt:untypedAtomic. Proto vrací instance of true.

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

Místo získání typované hodnoty vrací výraz (/a[1]) v následujícím příkladu posloupnost jednoho prvku, prvku <a>. Výraz instance of používá test prvku k ověření, že hodnota vrácená výrazem je uzelem prvku .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()')  

Note

Když dotazujete typovanou XML instanci a dotazovací výraz obsahuje nadřazenou osu, statické informace o typu výsledných uzlů již nejsou dostupné. Dynamický typ je však stále spojen s uzly.

Typovaná hodnota vs. hodnota řetězce

Každý uzel má typovanou hodnotu a hodnotu řetězce. U typovaných XML dat je typ typované hodnoty poskytován kolekcí XML schématu přiřazenou ke sloupci nebo proměnné, která je dotazována. Pro netypovaná XML data je typ typované hodnoty xdt:untypedAtomic.

Můžete použít funkci data() nebo string() k získání hodnoty uzlu:

V následující kolekci <root> XML schémat je definován prvek celočíselného typu:

CREATE XML SCHEMA COLLECTION SC AS N'  
<schema xmlns="http://www.w3.org/2001/XMLSchema">  
      <element name="root" type="integer"/>  
</schema>'  
GO  

V následujícím příkladu výraz nejprve získá typovanou hodnotu a /root[1] poté ji přičte 3 dál.

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

V dalším příkladu výraz selhává, protože v string(/root[1]) výrazu vrací hodnotu typu řetězce. Tato hodnota je pak předána aritmetickému operátoru, který přijímá pouze číselné typy jako své 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')  

Následující příklad počítá součet atributů LaborHours . Funkce data() získává typované hodnoty LaborHours atributů ze všech <Location> prvků produktového modelu. Podle XML schématu přiřazeného ke sloupci InstructionLaborHours je typ xs:decimal .

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  

Tento dotaz vrací výsledek 12,75.

Note

Explicitní použití funkce data() v tomto příkladu slouží pouze k ilustraci. Pokud není specifikován, sum() implicitně aplikuje funkci data() k extrakci typizovaných hodnot uzlů.