Par XML vārdtelpām- w3schools, un msdn raksti: WITH XMLNAMESPACE un xquery.
[ja nekas nemainīsies, emuārā parādīsies daudz vairāk raksti par XML. Domāju- arī plašāk par vārdtelpām, pašu XML, xpath, xml datu tipu, utt .. šobrīd šis sanāk mazliet izrauts no konteksta]
Datu izgūšana bez vārdtelplas
Declare @myXML XML;Noklusētā vārdtelpa
Set @myXML =
N'
<PersonInfo>
<Person ID="22">
<Name>Jānis2</Name>
<Profession>Galdnieks</Profession>
</Person>
</PersonInfo>
';
SELECT
@myXML.value('(PersonInfo/Person/@ID)[1]', 'nvarchar(100)') as ID,
@myXML.value('(PersonInfo/Person/Name)[1]', 'nvarchar(100)') as Name,
@myXML.value('(PersonInfo/Person/Profession)[1]', 'nvarchar(100)') as Profession;
Ja vaicājumā netiek norādīta noklusētā vārdtelpa, rezultāti netiek atgriezti. Šādi nestrādās:
Declare @myXML XML;Norādīt var izmantojot WITH XMLNAMESPACES. šādi būs pareizi:
Set @myXML =
N'
<PersonInfo xmlns="http://www.sqlblog.lv/default">
<Person ID="22">
<Name>Jānis2</Name>
<Profession>Galdnieks</Profession>
</Person>
</PersonInfo>
';
-- Šis nestrādā!
SELECT
@myXML.value('(PersonInfo/Person/@ID)[1]', 'nvarchar(100)') as ID,
@myXML.value('(PersonInfo/Person/Name)[1]', 'nvarchar(100)') as Name,
@myXML.value('(PersonInfo/Person/Profession)[1]', 'nvarchar(100)') as Profession;
Declare @myXML XML;Norādīt var arī savādāk (pie Profession nekas norādīts, tādēļ tur tiek atgriezta NULL vērtība):
Set @myXML =
N'
<PersonInfo xmlns="http://www.sqlblog.lv/default">
<Person ID="22">
<Name>Jānis2</Name>
<Profession>Galdnieks</Profession>
</Person>
</PersonInfo>
';
-- Šis strādā, jo ir XMLNamspace norādīts!
WITH XMLNAMESPACES (DEFAULT 'http://www.sqlblog.lv/default')
SELECT
@myXML.value('(PersonInfo/Person/@ID)[1]', 'nvarchar(100)') as ID,
@myXML.value('(PersonInfo/Person/Name)[1]', 'nvarchar(100)') as Name,
@myXML.value('(PersonInfo/Person/Profession)[1]', 'nvarchar(100)') as Profession;
Declare @myXML XML;Darbs ar vairāk kā vienu vārdtelpu.
Set @myXML =
N'
<PersonInfo xmlns="http://www.sqlblog.lv/default">
<Person ID="22">
<Name>Jānis2</Name>
<Profession>Galdnieks</Profession>
</Person>
</PersonInfo>
';
--Cits veids, kā norādīt (Profession netiek attēlots, jo nav zināms vai no pareizā namespace)
SELECT
@myXML.value('declare default element namespace "http://www.sqlblog.lv/default";
(PersonInfo/Person/@ID)[1]', 'nvarchar(100)') as ID,
@myXML.value('declare default element namespace "http://www.sqlblog.lv/default";
(PersonInfo/Person/Name)[1]', 'nvarchar(100)') as Name,
@myXML.value('(PersonInfo/Person/Profession)[1]', 'nvarchar(100)') as Profession;
Izmantojot With XMLNAMESPACES:
Declare @myXML XMLOtrs veids:
Set @myXML =
N'
<PersonInfo xmlns:my="http://www.sqlblog.lv/personName" xmlns="http://www.sqlblog.lv/default">
<my:Person ID="21">
<Name>Jānis1</Name>
<LastName>Bērziņš</LastName>
</my:Person>
<Person ID="22">
<Name>Jānis2</Name>
<Profession>Galdnieks</Profession>
</Person>
</PersonInfo>
';
WITH XMLNAMESPACES (
'http://www.sqlblog.lv/personName' as my,
DEFAULT 'http://www.sqlblog.lv/default'
)
SELECT
@myXML.value('(PersonInfo/my:Person/@ID)[1]', 'nvarchar(100)') as ID1,
@myXML.value('(PersonInfo/Person/@ID)[1]', 'nvarchar(100)') as ID2,
@myXML.value('(PersonInfo/my:Person/Name)[1]', 'nvarchar(100)') as Name1,
@myXML.value('(PersonInfo/Person/Name)[1]', 'nvarchar(100)') as Name2,
@myXML.value('(PersonInfo/my:Person/LastName)[1]', 'nvarchar(100)') as LastName,
@myXML.value('(PersonInfo/Person/Profession)[1]', 'nvarchar(100)') as Profession
Declare @myXML XML;
Set @myXML =
N'
<PersonInfo xmlns:my="http://www.sqlblog.lv/personName" xmlns="http://www.sqlblog.lv/default">
<my:Person ID="21">
<Name>Jānis1</Name>
<LastName>Bērziņš</LastName>
</my:Person>
<Person ID="22">
<Name>Jānis2</Name>
<Profession>Galdnieks</Profession>
</Person>
</PersonInfo>
';
SELECT
@myXML.value('
declare default element namespace "http://www.sqlblog.lv/default";
declare namespace my="http://www.sqlblog.lv/personName";
(PersonInfo/my:Person/@ID)[1]', 'nvarchar(100)') as ID
Nav komentāru:
Ierakstīt komentāru