Megosztás:


Type System (XQuery)

A következőkre vonatkozik:SQL Server

Az XQuery a sématípusok erősen gépelt nyelve, a nem beírt adatok pedig gyengén gépelt nyelve. Az XQuery előre definiált típusai a következők:

Ez a témakör a következőket is ismerteti:

Az XML-séma beépített típusai

Az XML-séma beépített típusai xs előre definiált névtérelőtaggal rendelkeznek. Ilyen típus például az xs:egész szám és xs:string. Ezek a beépített típusok mindegyike támogatott. Ezeket a típusokat xml-sémagyűjtemény létrehozásakor használhatja.

A beírt XML lekérdezésekor a csomópontok statikus és dinamikus típusát a lekérdezett oszlophoz vagy változóhoz társított XML-sémagyűjtemény határozza meg. A statikus és dinamikus típusokkal kapcsolatos további információkért lásd Kifejezéskörnyezet és lekérdezésértékelés (XQuery). A következő lekérdezés például egy beírt xml oszlopon (Instructions) van megadva. A kifejezés instance of használatával ellenőrzi, hogy a visszaadott LotSize attribútum beírt értéke xs:decimal típusú-e.

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  

Ezt a gépelési információt az oszlophoz társított XML-sémagyűjtemény adja meg.

XPath-adattípusok névterében definiált típusok

A http://www.w3.org/2004/07/xpath-datatypes névtérben definiált típusok xdtelőre definiált előtaggal rendelkeznek. Az alábbi típusokra vonatkozik:

  • Xml-sémagyűjtemény létrehozásakor nem használhatja ezeket a típusokat. Ezeket a típusokat az XQuery típusrendszerben használják, és XQuery és statikus gépelés. Az atomtípusokat például xdt:untypedAtomic, az xdt névtérbe helyezheti.

  • A nem beírt XML lekérdezésekor az elemcsomópontok statikus és dinamikus típusa xdt:untyped, az attribútumértékek típusa pedig xdt:untypedAtomic. Egy lekérdezés() metódus eredménye nem beírt XML-t hoz létre. Ez azt jelenti, hogy az XML-csomópontok xdt:untyped és xdt:untypedAtomiclesznek visszaadva.

  • A xdt:dayTimeDuration és xdt:yearMonthDuration típusok nem támogatottak.

Az alábbi példában a lekérdezés egy nem beírt XML-változóval van megadva. A data(/a[1]) kifejezés egy atomi érték sorozatát adja vissza. A data() függvény a <a>elem beírt értékét adja vissza. Mivel a lekérdezett XML nincs begépelve, a visszaadott érték típusa xdt:untypedAtomic. Ezért instance of igaz értéket ad vissza.

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

A gépelt érték beolvasása helyett a következő példában szereplő kifejezés (/a[1]) egy elemből, elemből <a>álló sorozatot ad vissza. A instance of kifejezés az elemteszt használatával ellenőrzi, hogy a kifejezés által visszaadott érték a xdt:untyped typeelemcsomópontja-e.

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

Jegyzet

Ha egy beírt XML-példányt kérdez le, és a lekérdezési kifejezés tartalmazza a szülőtengelyt, az eredményként kapott csomópontok statikus típusadatai már nem érhetők el. A dinamikus típus azonban továbbra is a csomópontokhoz van társítva.

Beírt érték és sztringérték

Minden csomóponthoz tartozik egy beírt érték és egy sztringérték. A beírt XML-adatok esetében a beírt érték típusát a lekérdezett oszlophoz vagy változóhoz társított XML-sémagyűjtemény adja meg. Nem beírt XML-adatok esetén a beírt érték típusa xdt:untypedAtomic.

A csomópont értékének lekéréséhez használhatja az data() vagy sztring() függvényt:

A következő XML-sémagyűjteményben az egész számtípus <root> eleme van definiálva:

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

A következő példában a kifejezés először lekéri a /root[1] beírt értékét, majd hozzáadja 3 hozzá.

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

A következő példában a kifejezés meghiúsul, mert a kifejezés string(/root[1]) egy sztring típusú értéket ad vissza. Ez az érték ezután egy olyan aritmetikai operátornak lesz átadva, amely csak numerikus típusú értékeket vesz fel operandusként.

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

Az alábbi példa a LaborHours attribútumok összegét számítja ki. A data() függvény lekéri LaborHours attribútumok beírt értékeit a termékmodell <Location> elemeiből. A Instruction oszlophoz társított XML-séma szerint a LaborHoursxs:decimális típusú.

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  

Ez a lekérdezés 12,75 értéket ad eredményül.

Jegyzet

Az data() függvény explicit használata ebben a példában csak illusztráció. Ha nincs megadva, sum() implicit módon alkalmazza a data() függvényt a csomópontok típusos értékeinek kinyerésére.

Lásd még:

SQL Server Profiler-sablonok és -engedélyek
XQuery basics