trešdiena, 2011. gada 28. septembris

SQL Server XML Datu tipa metodes

Īss pārskats par SQL Server XML datu  tipa metodēm (query(), value(), exist(), modify(), nodes()). Kādi ir ieejas parametri šīm metodēm un ko ar to palīdzību var izdarīt. Neliels piemērs katrai no tām.

XML Datu tipu metodes, gluži kā XML un XQuery izteiksmes ir reģistrjūtīgas (Case Sensitive), līdz ar to jāpievērš uzmanība lielajiem un mazajiem burtiem.

Šajā rakstā visa uzmanība XML datu tipa metodēm, bet lai vairumu no tām varētu pilnvērtīgi izmantot, ir jāzina XQuery. Vairāk par XQuery izteiksmēm- msdn.
Savukārt lai mainītu XML izmantojot modify() metodi, ir jāizmanto XML_DML izteiksmes par to vairāk- msdn.

query() (msdn)
Ieejas parametrs: XQuery izteiksme.
Izeja: XML datu tips
Izmanto: lai XML dokumentā/fragmentā sameklētu datus.
Piemērs:
Declare @myXML XML
Set @myXML  =
N'
<PersonInfo>
    <Person ID="21">
        <Name>Jānis</Name>
        <LastName>Bērziņš</LastName>
    </Person>
    <Person ID="22">
        <Name>Liene</Name>
        <Profession>Kociņa</Profession>
    </Person>
</PersonInfo>
';
-- atgriež visus "Name" elementus
Select @myXML.query('//Name')
-- atgriež pirmo "Name" elementu
Select @myXML.query('(//Name)[1]')
-- atgriež pirmā "Name" elementa vērtību
Select @myXML.query('(//Name)[1]/text()')
value() (msdn)
Ieejas parametrs: XQuery izteiksme un atgriežamā rezultāta datu tips (parametrā kā teksts)
Izeja: Rezultāts atgriezts ieejas parametrā norādītā tipa formātā.
Izmanto: lai
Piemērs: Vairāki piemēri atrodami rakstā "Datu izgūšana no XML: XML vārdtelpas (namespaces)" un arī zemāk rakstā, pie "nodes()" metodes apraksta.

exist() (msdn)
Ieejas parametrs: XQuery izteiksme.
Izeja: 1, ja XQuery vaicājums atgriež rezultātus; 0, ja XQuery atgriež tukšumu.
Izmanto: lai pārbaudītu, vai XQuery izteiksmei eksistē rezultāti.
Piemērs:
Declare @myXML XML
Set @myXML  =
N'
<PersonInfo>
    <Person ID="21">
        <Name>Jānis</Name>
        <LastName>Bērziņš</LastName>
    </Person>
    <Person ID="22">
        <Name>Liene</Name>
        <Profession>Kociņa</Profession>
    </Person>
</PersonInfo>
';
if(@myXML.exist('//Person[@ID=0]') = 1)
    print 'Eksistē 0' -- nekad neizpildās.
if(@myXML.exist('//Person[@ID=22]') = 1)
    print 'Eksistē 22' -- tiks izvadīts!
modify() (msdn)
Ieejas parametrs: XML_DML izteiksme.
Izeja: Maina atbilstošā XML saturu.
Izmanto: Lai mainītu XML saturu (opā).
Piemērs:
[2011-12-27 papildināts] XML elementa vērtības mainīšana (xml modify() metode) 
un
Declare @myXML XML
Set @myXML  =
N'
<PersonInfo>
    <Person ID="21">
        <Name>Jānis</Name>
        <LastName>Bērziņš</LastName>
    </Person>
    <Person ID="22">
        <Name>Liene</Name>
        <Profession>Kociņa</Profession>
    </Person>
</PersonInfo>
';
-- dzēš 1. "Name" elementu
SET @myXML.modify('delete (//Name)[1]')
SELECT @myXML
-- aizvieto "Bērziņš" ar "Kokle"
SET @myXML.modify('replace value of (//LastName)[1]/text()[1] with "Kokle"')
SELECT @myXML
nodes() (msdn)
Ieejas parametrs: XQuery izteiksme un jānorāda tabula un tabulas kolonna, kurā tiks atgriezts rezultāts.
Izeja: Ieejas parametrā norādītā tabula ar vienu norādīto kolonnu, kur katrā rindā vaicājuma rezultāts.
Izmanto: Piemēram, lai pārveidotu XML datus par relāciju datiem.
Piemērs:
Declare @myXML XML
Set @myXML  =
N'
<PersonInfo>
    <Person ID="21">
        <Name>Jānis</Name>
        <LastName>Bērziņš</LastName>
    </Person>
    <Person ID="22">
        <Name>Liene</Name>
        <Profession>Kociņa</Profession>
    </Person>
</PersonInfo>
';
-- atgriež divas rindas. Katrā rindā Name elements.
Select tab.x.query('.'), tab.x.value('(.)[1]', 'nvarchar(100)') Vārds
FROM @myXML.nodes('*//Name') as tab(x);
-- mazliet citādāk..
Select
    tab.x.value('(./@ID)[1]', 'nvarchar(100)') ID,
    tab.x.value('(./Name)[1]', 'nvarchar(100)') Name,
    tab.x.value('(./LastName)[1]', 'nvarchar(100)') LastName,
    tab.x.value('(./Profession)[1]', 'nvarchar(100)') Profession
FROM @myXML.nodes('*//Person') as tab(x);

Nav komentāru:

Ierakstīt komentāru