Dela via


Typsystem (XQuery)

gäller för:SQL Server

XQuery är ett starkt skrivet språk för schematyper och ett svagt skrivet språk för otypade data. De fördefinierade typerna av XQuery innehåller följande:

Det här avsnittet beskriver också följande:

Inbyggda typer av XML-schema

De inbyggda typerna av XML-schema har ett fördefinierat namnområdesprefix på xs. Några av dessa typer är xs:heltal och xs:string. Alla dessa inbyggda typer stöds. Du kan använda dessa typer när du skapar en XML-schemasamling.

När du frågar efter typ av XML bestäms den statiska och dynamiska typen av noder av XML-schemasamlingen som är associerad med kolumnen eller variabeln som efterfrågas. Mer information om statiska och dynamiska typer finns i Expression Context and Query Evaluation (XQuery). Följande fråga anges till exempel mot en skriven xml- kolumn (Instructions). Uttrycket använder instance of för att verifiera att det typerade värdet för det LotSize attribut som returneras är av xs:decimal typ.

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  

Den här skrivinformationen tillhandahålls av XML-schemasamlingen som är associerad med kolumnen.

Typer som definierats i namnområdet XPath-datatyper

De typer som definieras i namnområdet http://www.w3.org/2004/07/xpath-datatypes har ett fördefinierat prefix för xdt. Följande gäller för dessa typer:

  • Du kan inte använda dessa typer när du skapar en XML-schemasamling. Dessa typer används i XQuery-typsystemet och används för XQuery och static typing. Du kan casta till atomiska typer, till exempel xdt:untypedAtomic, i xdt namnrymd.

  • När du kör frågor mot otypad XML den statiska och dynamiska typen av elementnoder xdt:untyped, och typen av attributvärden är xdt:untypedAtomic. Resultatet av en query()-metoden genererar otypad XML. Det innebär att XML-noderna returneras som xdt:untyped respektive xdt:untypedAtomic.

  • xdt:dayTimeDuration och xdt:yearMonthDuration typer stöds inte.

I följande exempel anges frågan mot en otypad XML-variabel. Uttrycket, data(/a[1]), returnerar en sekvens med ett atomvärde. Funktionen data() returnerar det typinskrivna värdet för elementet <a>. Eftersom XML-koden som efterfrågas är otypad är typen av det värde som returneras xdt:untypedAtomic. Därför returnerar instance of sant.

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

I stället för att hämta det inskrivna värdet returnerar uttrycket (/a[1]) i följande exempel en sekvens med ett element, ett element <a>. instance of-uttrycket använder elementtestet för att verifiera att värdet som returneras av uttrycket är en elementnod i 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()')  

Not

När du kör frågor mot en typinstans av XML och frågeuttrycket innehåller den överordnade axeln är den statiska typinformationen för de resulterande noderna inte längre tillgänglig. Den dynamiska typen är dock fortfarande associerad med noderna.

Typat värde jämfört med strängvärde

Varje nod har ett skrivet värde och ett strängvärde. För inskrivna XML-data tillhandahålls typen av det typdefinierade värdet av XML-schemasamlingen som är associerad med kolumnen eller variabeln som efterfrågas. För otypade XML-data är typen av det typerade värdet xdt:untypedAtomic.

Du kan använda funktionen data() eller string() för att hämta värdet för en nod:

I följande XML-schemasamling definieras det <root> elementet i heltalstypen:

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

I följande exempel hämtar uttrycket först det typgivna värdet för /root[1] och lägger sedan till 3 till det.

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

I nästa exempel misslyckas uttrycket eftersom string(/root[1]) i uttrycket returnerar ett strängtypsvärde. Det här värdet skickas sedan till en aritmetikoperator som endast tar numeriska typvärden som operander.

-- 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')  

I följande exempel beräknas summan av de LaborHours attributen. Funktionen data() hämtar de inskrivna värdena för LaborHours attribut från alla <Location> element för en produktmodell. Enligt XML-schemat som är associerat med kolumnen Instruction är LaborHours av xs:decimal typ.

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  

Den här frågan returnerar 12,75 som resultat.

Not

Den explicita användningen av funktionen data() i det här exemplet är endast till för illustration. Om den inte har angetts tillämpar sum() implicit funktionen data() för att extrahera nodernas inskrivna värden.

Se även

SQL Server Profiler-mallar och behörigheter
grunderna i XQuery