Notitie
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen u aan te melden of de directory te wijzigen.
Voor toegang tot deze pagina is autorisatie vereist. U kunt proberen de mappen te wijzigen.
Van toepassing op:SQL Server
XQuery is een sterk getypeerde taal voor schematypen en een zwak getypeerde taal voor niet-getypeerde data. De vooraf gedefinieerde typen XQuery omvatten de volgende:
Ingebouwde typen XML-schema's in de http://www.w3.org/2001/XMLSchema naamruimte.
Types gedefinieerd in de http://www.w3.org/2004/07/xpath-datatypes naamruimte.
Dit onderwerp beschrijft ook het volgende:
De getypeerde waarde versus de stringwaarde van een knooppunt.
Het overeenkomen met het sequentietype dat door een expressie wordt teruggegeven.
Ingebouwde typen XML-schema's
De ingebouwde typen XML-schema's hebben een vooraf gedefinieerde naamruimtevoorvoegsel xs. Enkele van deze typen zijn xs:integer en xs:string. Al deze ingebouwde types worden ondersteund. Je kunt deze typen gebruiken bij het aanmaken van een XML-schemacollectie.
Bij het opvragen van getypeerde XML wordt het statische en dynamische type van de knooppunten bepaald door de XML-schemacollectie die is gekoppeld aan de kolom of variabele die wordt geraadpleegd. Voor meer informatie over statische en dynamische types, zie Expression Context and Query Evaluation (XQuery). Bijvoorbeeld, de volgende query wordt gespecificeerd tegen een getypeerde xml-kolom (Instructions). De expressie wordt gebruikt instance of om te verifiëren dat de getypte waarde van het LotSize teruggegeven attribuut van xs:decimal het type is.
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
Deze type-informatie wordt geleverd door de XML-schemacollectie die aan de kolom is gekoppeld.
Types gedefinieerd in XPath Data Types naamruimte
De types die in de http://www.w3.org/2004/07/xpath-datatypes naamruimte zijn gedefinieerd, hebben een vooraf gedefinieerd prefix xdt. Het volgende geldt voor deze typen:
Je kunt deze typen niet gebruiken wanneer je een XML-schemacollectie maakt. Deze typen worden gebruikt in het XQuery-typesysteem en worden gebruikt voor XQuery en statisch typeren. Je kunt naar de atomaire types casten, bijvoorbeeld xdt:untypedAtomic, in de xdt-naamruimte .
Bij het opvragen van ongetypeerde XML is het statische en dynamische type elementknooppunten xdt:untyped, en het type attribuutwaarden is xdt:untypedAtomic. Het resultaat van een query() -methode genereert ongetypeerde XML. Dit betekent dat de XML-nodes respectievelijk worden teruggegeven als xdt:untyped en xdt:untypedAtomic.
De typen xdt:dayTimeDuration en xdt:yearMonthDuration worden niet ondersteund.
In het volgende voorbeeld wordt de query gespecificeerd tegen een niet-getypte XML-variabele. De uitdrukking ), data(/a[1]geeft een reeks van één atomaire waarde terug. De data() functie geeft de getypeerde waarde van het element <a>terug. Omdat de XML die wordt geraadpleegd niet getypeerd is, is xdt:untypedAtomichet type van de teruggegeven waarde . Daarom geeft waar instance of terug.
DECLARE @x xml
SET @x='<a>20</a>'
SELECT @x.query( 'data(/a[1]) instance of xdt:untypedAtomic' )
In plaats van de getypeerde waarde op te halen, geeft de uitdrukking (/a[1]) in het volgende voorbeeld een reeks van één element, element <a>. De instance of expressie gebruikt de elementtest om te verifiëren dat de waarde die door de expressie wordt teruggegeven een elementknoop van xdt:untyped typeis.
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
Wanneer je een getypeerde XML-instantie opvraagt en de query-expressie de ouderas bevat, is de statische type-informatie van de resulterende knooppunten niet langer beschikbaar. Het dynamische type blijft echter geassocieerd met de knooppunten.
Getypte waarde versus stringwaarde
Elke knoop heeft een getypeerde waarde en een stringwaarde. Voor getypte XML-gegevens wordt het type van de getypte waarde geleverd door de XML-schemacollectie die is gekoppeld aan de kolom of variabele die wordt geraadpleegd. Voor ongetypte XML-gegevens is het type van de getypte waarde xdt:untypedAtomic.
Je kunt de data() of string() functie gebruiken om de waarde van een knooppunt op te halen:
De datafunctie (XQuery) geeft de getypeerde waarde van een knoop terug.
De string Function (XQuery) geeft de stringwaarde van de knoop terug.
In de volgende XML-schemaverzameling wordt het <root> element van het gehele getal gedefinieerd:
CREATE XML SCHEMA COLLECTION SC AS N'
<schema xmlns="http://www.w3.org/2001/XMLSchema">
<element name="root" type="integer"/>
</schema>'
GO
In het volgende voorbeeld haalt de expressie eerst de getypeerde waarde van op /root[1] en voegt deze vervolgens op.3
DECLARE @x xml(SC)
SET @x='<root>5</root>'
SELECT @x.query('data(/root[1]) + 3')
In het volgende voorbeeld faalt de expressie, omdat de string(/root[1]) in de expressie een stringtypewaarde teruggeeft. Deze waarde wordt vervolgens doorgegeven aan een rekenkundige operator die alleen numerieke typewaarden als operanden neemt.
-- 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')
Het volgende voorbeeld berekent het totaal van de LaborHours attributen. De data() functie haalt de getypeerde waarden van LaborHours attributen op uit alle <Location> elementen voor een productmodel. Volgens het XML-schema dat aan de Instruction kolom is gekoppeld, LaborHours is het type xs:decimaal .
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
Deze zoekopdracht levert 12,75 als resultaat op.
Note
Het expliciete gebruik van de data() -functie in dit voorbeeld is alleen ter illustratie. Als dit niet is gespecificeerd, past sum() impliciet de data() -functie toe om de getypeerde waarden van de knooppunten te extraheren.