Jegyzet
Az oldalhoz való hozzáférés engedélyezést igényel. Próbálhatod be jelentkezni vagy könyvtárat váltani.
Az oldalhoz való hozzáférés engedélyezést igényel. Megpróbálhatod a könyvtár váltását.
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:
Az XML-séma beépített típusai a http://www.w3.org/2001/XMLSchema névtérben.
A http://www.w3.org/2004/07/xpath-datatypes névtérben definiált típusok.
Ez a témakör a következőket is ismerteti:
A beírt érték és a csomópont sztringértéke.
Egy kifejezés által visszaadott sorozattípusnak felel meg.
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:
Az adatfüggvény (XQuery) egy csomópont beírt értékét adja vissza.
A sztringfüggvény (XQuery) a csomópont sztringértékét adja vissza.
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.