Konstrukcija varētu būt mazliet mulsinoša, ja iepriekš nav izmantots Cross Apply vai Outer Apply. Zemāk skriptā ir neliels "špikērīts", kā izgūt datus:
Declare @myXML XMLEmuārā par XML: XML SQL Server.
Declare @tab Table
(
tabId int primary key identity,
iestade nvarchar(50),
darbinieki xml
)
Insert Into @tab(iestade, darbinieki)
Values
(N'kaut kāda iestāde', 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>
');
Insert Into @tab(iestade, darbinieki)
Values (N'Cita iestāde', Null)
-- Parasts selekts:
Select * From @tab;
-- Iegūt darbiniekus no 1 iestādes var arī šādi:
declare @darbinieki xml;
Select @darbinieki = darbinieki
From @tab
Where iestade = N'kaut kāda iestāde';
Select
t.x.value('(Name)[1]', 'nvarchar(50)') vards,
t.x.value('(LastName)[1]', 'nvarchar(50)') uzvards,
t.x.query('.')
From @darbinieki.nodes('/PersonInfo/Person') t(x)
--izmantojot Cross Apply (līdzīgi kā Inner Join- rezultātā 2 rindas):
Select
tabid,
iestade,
t.x.value('(Name)[1]', 'nvarchar(50)') vards,
t.x.value('(LastName)[1]', 'nvarchar(50)') uzvards
From @tab
Cross Apply darbinieki.nodes('/PersonInfo/Person') t(x)
--izmantojot Outer Apply (līdzīgi kā Left Join- rezultātā 3 rindas):
Select
tabid,
iestade,
t.x.value('(Name)[1]', 'nvarchar(50)') vards,
t.x.value('(LastName)[1]', 'nvarchar(50)') uzvards
From @tab
Outer Apply darbinieki.nodes('/PersonInfo/Person') t(x)
Nav komentāru:
Ierakstīt komentāru