Poznámka:
Přístup k této stránce vyžaduje autorizaci. Můžete se zkusit přihlásit nebo změnit adresáře.
Přístup k této stránce vyžaduje autorizaci. Můžete zkusit změnit adresáře.
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í:
Vestavěné typy XML schématu v jmenném http://www.w3.org/2001/XMLSchema prostoru.
Typy definované v http://www.w3.org/2004/07/xpath-datatypes jmenném prostoru.
Toto téma také popisuje následující:
Typovaná hodnota versus hodnota řetězce uzlu.
Přiřazení typu sekvence vráceného výrazem.
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:
Datová funkce (XQuery) vrací typovanou hodnotu uzlu.
String Function (XQuery) vrací hodnotu řetězce 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ů.