Tagi na forum.

Windows 14206 SQL Server 2132
sieci 6796 Windows XP 1922
SQL 6578 Outlook 1838
SBS 3868 Uprawnienia 1777
Windows 2003 2781 IIS 1636
Windows Server 2588 Office 1516
DNS 2315 Skrypt 1499

pokaż wszystkie tagi na forum

Pobieranie danych T-sql z plików XML z wieloma hierarchiami

lukii21 2012-01-31 16:34:08
0
avatar
 
 

Witam,

mam załadować tabele w sql danymi z XML-a. Niestety pojawił się problem ponieważ XML posiada kilka poziomów hierarchii. Poniżej umieściłem skrypt w którym wyciągam jedną daną "AtcCode" potrzebuję wyciągnąć dane z wyższego poziomu DrugDescription kolumnę DrugId.

XML:

<?xml version="1.0" encoding="utf-16"?><ArrayOfDrugDescription xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">  <DrugDescription>    <DrugId>1</DrugId>    <DrugShortName>Abaktal</DrugShortName>    <DrugDescComposition>1 tabl. powl.</DrugDescComposition>    <DrugDescActivity>Chemioterapeutyk </DrugDescActivity>    <DrugDescIndication>Pefloną odpornością.</DrugDescIndication>    <DrugDescContrInd>Nadwrażliwość zgowych).</DrugDescContrInd>    <DrugDescWarning>Ostrożnie zy-galaktozy.</DrugDescWarning>    <DrugDescPregn>Nie stosować w ciąży i okresie karmienia piersią.</DrugDescPregn>    <DrugDescSideEff>Zaburzenia dnią kończynę).</DrugDescSideEff>    <DrugDescInter>Preparaty nie pefloksacyny we krwi.</DrugDescInter>    <DrugDescDosage>Doustnie. Doroślleży zmniejszyć dawki.</DrugDescDosage>    <DrugDescNotes>Pacjen4:35:14--&amp;gt;</DrugDescNotes>    <DrugTherClass>chemotherapeuticum</DrugTherClass>    <DrugProdName>Sandoz</DrugProdName>    <DrugProdID>619</DrugProdID>    <DrugAtc>      <item>        <AtcCode>J01MA03</AtcCode>      </item>    </DrugAtc>    <DrugSubst>      <item>        <SubstId>895</SubstId>      </item>    </DrugSubst>    <Modified>2011-10-03 13:08:41</Modified>    <Status>active</Status>  </DrugDescription>

Mój skrypt:

SELECT --X.DrugDescription.query('DrugId').value('.', 'INT'),Y.item.query('AtcCode').value('.', 'VARCHAR(10)'),Y.item.query('DrugId').value('.', 'INT')FROM (SELECT CAST(x AS XML) FROM OPENROWSET(BULK 'D:\Shared\ImportLekowPharmindex\Pliki_xml\DrugDescription.xml',SINGLE_BLOB) AS T(x)) AS T(x)    cross APPLY x.nodes('ArrayOfDrugDescription/DrugDescription/DrugAtc/item') AS Y(item)


tagi: XML
Liczba postów:

lukii21  2012-01-31 16:37:49 #1
0
avatar
 
 

 

version="1.0" encoding="utf-16" ?>
- <ArrayOfDrugDescription xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema">
- <DrugDescription>
  <DrugId>1</DrugId>
  <DrugShortName>Abaktal</DrugShortName>
  <DrugDescComposition>1 tabl. powl. zawiera 400 mg pefloksacyny w postaci mezylanu.</DrugDescComposition>
  <DrugDescActivity>Chemioterapeutyk z grupy fluorochinolonów. Działa bakteriobójczo na pałeczki &lt;I&gt;Enterobacteriaceae&lt;/I&gt; (m.in. &lt;I&gt;Escherichia coli&lt;/I&gt;, &lt;I&gt;Klebsiella spp&lt;/I&gt;., &lt;I&gt;Enterobacter spp.&lt;/I&gt;, &lt;I&gt;Serratia spp.&lt;/I&gt;, &lt;I&gt;Proteus mirabilis&lt;/I&gt; i indolo-dodatnie szczepy &lt;I&gt;Proteus&lt;/I&gt;, &lt;I&gt;Citrobacter spp.&lt;/I&gt;, &lt;I&gt;Salmonella spp.&lt;/I&gt;, &lt;I&gt;Shigella spp.&lt;/I&gt;), &lt;I&gt;Haemophilus influenzae&lt;/I&gt;, &lt;I&gt;Staphylococcus spp.&lt;/I&gt;, &lt;I&gt;Neisseria spp.&lt;/I&gt; Umiarkowaną wrażliwość wykazują &lt;I&gt;Streptococcus spp.&lt;/I&gt; (w tym &lt;I&gt;S. pneumoniae&lt;/I&gt;), &lt;I&gt;Pseudomonas aeruginosa&lt;/I&gt;, &lt;I&gt;Acinetobacter spp.&lt;/I&gt;, &lt;I&gt;Mycoplasma spp&lt;/I&gt;, &lt;I&gt;Chlamydia trachomatis&lt;/I&gt;. Pefloksacyna nie działa na Gram-dodatnie bakterie beztlenowe, krętki, &lt;I&gt;Mycobacterium tuberculosis&lt;/I&gt;. Szybko i niemal całkowicie wchłania się z przewodu pokarmowego. Wiązanie z białkami osocza wynosi 20-30%. Lek dobrze przenika do tkanek i płynów ustrojowych, osiągając duże stężenia zwłaszcza w żółci. Pefloksacyna jest w znacznym stopniu metabolizowana w wątrobie i wydalana w postaci niezmienionej oraz w postaci metabolitów z moczem (31-59%), a także z kałem. T&lt;sub&gt;0,5&lt;/sub&gt; w fazie eliminacji wynosi średnio 12 h (8-15 h). U pacjentów z zaburzeniami czynności wątroby klirens osoczowy pefloksacyny jest znacząco zmniejszony, T&lt;sub&gt;0,5&lt;/sub&gt; ulega wydłużeniu.</DrugDescActivity>
  <DrugDescIndication>Pefloksacyna może być stosowana w monoterapii lub w skojarzeniu z innymi lekami przeciwbakteryjnymi. Wskazaniami do jej stosowania są zakażenia układu oddechowego, moczowego, ucha, nosa i gardła, przewodu pokarmowego i dróg żółciowych, kości, stawów, skóry, posocznica, zapalenie wsierdzia i opon mózgowo-rdzeniowych, a także leczenie i zapobieganie zakażeniom u pacjentów z osłabioną odpornością.</DrugDescIndication>
  <DrugDescContrInd>Nadwrażliwość na pefloksacynę lub ciężka reakcja alergiczna po podaniu chinologów, ciąża, okres karmienia piersią, dzieci przed zakończeniem procesu wzrastania, pacjenci z niedoborem G-6-PD lub chorobami o.u.n. (padaczka, miażdżyca naczyń mózgowych).</DrugDescContrInd>
  <DrugDescWarning>Ostr

C3PO  2012-01-31 17:38:27 #2
0
avatar
 
 

Proponuję, byś wystawił gdzieś oryginalny plik XML (albo, jeśli zawiera on poufne dane, przynajmniej jakąś rozsądną reprezentację danych).


Pozdrawiam,
Paweł Potasiński
Partner Technology Advisor | Microsoft Polska 
Blog SQLGeekPLSSUG

OpenRowset  2012-01-31 22:01:05 #2.1
0
avatar Ekspert WSS
 
 

"Partner Technology Advisor | Microsoft Polska" - chyba mi coś umknęło :)


OpenRowset

Cierpliwie zbieram na Windowsa. Jeżeli rozwiązałem problem kliknij [Rozwiązanie], jeżeli pomogłem klinknij [Pomógł mi] :)

OpenRowset  2012-01-31 22:07:49 #4
0
avatar Ekspert WSS
 
 

AFAIR Możesz odpytywać "w górę" ale tu potrzebne jest poprawne nawigowanie. Dodatkowo pamiętaj że takie wędrowanie bardzo spowalnia zapytania. Poniżej przykłady.

declare  @Podwezel table(x xml)
insert @Podwezel(x) values('
<DrugDescription>
  <DrugId>1</DrugId>
  <DrugAtc>
    <item>
      <AtcCode>J01MA03</AtcCode>
    </item>
  </DrugAtc>
</DrugDescription>
')


--- dużo nawigowania w górę - wolne zapytanie
select 
v1=t.query('.'),v2=t.value('(.)[1]', 'varchar(1000)'),
v3=t.query('../../.././DrugId'), v4=t.value('(../../.././DrugId)[1]', 'int')
from @Podwezel cross apply x.nodes('/DrugDescription/DrugAtc/item/AtcCode') x(t)
---
select 
v1=t.query('./DrugId'), v4=t.value('(./DrugAtc/item/AtcCode)[1]', 'varchar(1000)')
from @Podwezel cross apply x.nodes('/DrugDescription') x(t)

OpenRowset

Cierpliwie zbieram na Windowsa. Jeżeli rozwiązałem problem kliknij [Rozwiązanie], jeżeli pomogłem klinknij [Pomógł mi] :)

C3PO  2012-01-31 23:54:22 #5
0
avatar
 
 

@Openrowset: Pewnie tak :-) Pisałem o tym na blogu w grudniu :-D

@lukii21: Przekopywanie się przez XML to kwestia wielokrotnego uzycia CROSS APPLY w jednym zapytaniu. Nie musisz niczego zapisywać na bok i budować osobnych zapytań dla każdego poziomu zagnieżdżenia.


Pozdrawiam,
Paweł Potasiński
Partner Technology Advisor | Microsoft Polska 
Blog SQLGeekPLSSUG

lukii21  2012-02-01 08:59:14 #6
0
avatar
 
 

Witam,

poniżej moje rozwiązanie, które działa :)

SELECT X.DrugDescription.query('DrugId').value('.', 'INT'),X.DrugDescription.query('DrugAtc/item/AtcCode').value('.', 'VARCHAR(10)')   

FROM (   

SELECT CAST(x AS XML)   

FROM OPENROWSET(        BULK 'D:\Shared\ImportLekowPharmindex\Pliki_xml\DrugDescription.xml',        SINGLE_BLOB) AS T(x)        ) AS T(x)    CROSS APPLY x.nodes('ArrayOfDrugDescription/DrugDescription') AS X(DrugDescription);


Udziel odpowiedzi

avatar
Treść wpisu:

Zaloguj się lub Zarejestruj się aby wykonać tę czynność.

Idź na górę strony