otrdiena, 2011. gada 27. decembris

XML elementa vērtības mainīšana (xml modify() metode)

Rakstā par to, kā mainīt XML datu tipu- elementa vērtību. Un par to, kas jāņem vērā.

Ievadam: SQL Server XML datu tipa datu mainīšanai izmanto speciālu XQuery valodas paplašinājumu- XML Data Modification Language - XML_DML, kas XQuery papildina ar trīs reģistrjūtīgiem atslēgvārdiem- "insert", "delete" un "replace value of". Par to vairāk- msdn.

Domāju vairumam pirmā doma būs izmantot "replace value of". Tālāk jau tam būtu jābūt tikai sintakses jautājumam:
declare @xml xml
set @xml = '<MansElements>Veca vertiba</MansElements>'
select @xml
set @xml.modify('replace value of (/MansElements/text())[1] with "Jauna vertiba"')
select @xml
Problēma ir tad, ja Šis elements ir tukšs. Tad vērtība netiek aizvietota.. Lūk:
-- PROBLĒMA!
declare @xml xml
set @xml = '<MansElements></MansElements>'
select @xml
set @xml.modify('replace value of (/MansElements/text())[1] with "Jauna vertiba"')
select @xml
Tukšu elementu var aizpildīt šādi:
declare @xml xml
set @xml = '<MansElements></MansElements>'
select @xml
set @xml.modify('insert text{"Jauna vertiba"} into (/MansElements)[1]');
select @xml
Rezumējot- skaistu veidu, kā to izdarīt ar vienu komandu es neatradu.

Kā variantu varētu izmantot ko šādu (strādā abos gadījumos korekti- ja ir vai ja nav vērtība):
declare @xml xml
set @xml = '<MansElements>aaa</MansElements>'
if(@xml.value('(/MansElements)[1]', 'nvarchar(max)') = '')
    set @xml.modify('insert text{"Jauna vertiba"} into (/MansElements)[1]');
else
    set @xml.modify('replace value of (/MansElements/text())[1] with "Jauna vertiba"');
select @xml

Starp citu, viela pārdomām- kāda atšķirība ir starp tekstu, kas ir '' (tukšs) un 'NULL' :)? Un kā var dabūt 'NULL' XML datu tipā?

Nav komentāru:

Komentāra publicēšana