2016-04-24 11 views
1

Ich bin dabei an example Beitrag von einem Mitglied zum Importieren von XML-Dateien in SQL Server geschrieben.Skript zum Importieren von XML-Datei in SQL Server

Allerdings habe ich einige Tags innerhalb eines Tags in meiner XML-Datei, wie unten gezeigt. Ich bin nicht sicher, zum Beispiel, wie man Referenz-Tags wie:

<foreign-keys> 
    <key app="EN" db-id="9d2tazta9vxatier92ovpfa9zw9vxvwxtarv">23</key> 
</foreign-keys> 

in meinem SQL-Skript, unten ist die XML-Beispieldatei I, mit denen ich zu tun enthält 3 Beobachtungen

<record> 
    <database name="PALEO-1.ENL" path="PALEO-1.ENL">PALEO-1.ENL</database> 
    <source-app name="EndNote" version="17.5">EndNote</source-app> 
    <rec-number>23</rec-number> 
    <foreign-keys> 
     <key app="EN" db-id="9d2tazta9vxatier92ovpfa9zw9vxvwxtarv">23</key> 
    </foreign-keys> 
    <ref-type name="Equation">39</ref-type> 
    <contributors></contributors> 
    <titles> 
     <title> 
      <style face="normal" font="default" size="100%">Boltzmann&apos;s Constant (k)</style> 
     </title> 
    </titles> 
    <dates></dates> 
    <image> 
     <style face="normal" font="default" size="100%">11982090273675629314boltz.gif</style> 
    </image> 
    <caption> 
     <style face="normal" font="default" size="100%">Boltzmann&apos;s Constant (k)</style> 
    </caption> 
    <notes> 
     <style face="normal" font="default" size="100%">The number that relates the average energy of a molecule to its absolute temperature. Boltzmann&apos;s constant is approximately 1.38×10</style> 
     <style face="superscript" font="default" size="100%">23</style> 
     <style face="normal" font="default" size="100%"> J/K (joules/kelvin).</style> 
    </notes> 
    <urls></urls> 
</record> 
<record> 
<database name="PALEO-1.ENL" path="PALEO-1.ENL">PALEO-1.ENL</database><source-app name="EndNote" version="17.5">EndNote</source-app><rec-number>13</rec-number><foreign-keys><key app="EN" db-id="9d2tazta9vxatier92ovpfa9zw9vxvwxtarv">13</key></foreign-keys><ref-type name="Case">7</ref-type><contributors></contributors><titles><title><style face="normal" font="default" size="100%">Valdez v. Black</style></title><secondary-title><style face="normal" font="default" size="100%">F.2d</style></secondary-title></titles><pages><style face="normal" font="default" size="100%">1071</style></pages><volume><style face="normal" font="default" size="100%">446</style></volume><dates><year><style face="normal" font="default" size="100%">1971</style></year></dates><publisher><style face="normal" font="default" size="100%">10th Circ.</style></publisher><urls></urls></record> 
<record> 
<database name="PALEO-1.ENL" path="PALEO-1.ENL">PALEO-1.ENL</database><source-app name="EndNote" version="17.5">EndNote</source-app><rec-number>201</rec-number><foreign-keys><key app="EN" db-id="9d2tazta9vxatier92ovpfa9zw9vxvwxtarv">201</key></foreign-keys><ref-type name="Generic">13</ref-type><contributors></contributors><auth-address><style face="normal" font="default" size="100%">American Geophysical Union, 1909 K St. N.W., Washington, DC 20006</style></auth-address><titles><title><style face="normal" font="default" size="100%">Geophysical Research Letters</style></title><secondary-title><style face="normal" font="default" size="100%">Sedimentary Geology</style></secondary-title></titles><num-vols><style face="normal" font="default" size="100%">Vol. 1 (May 1974)-</style></num-vols><keywords><keyword><style face="normal" font="default" size="100%">Geophysics Periodicals</style></keyword><keyword><style face="normal" font="default" size="100%">Planets Periodicals</style></keyword><keyword><style face="normal" font="default" size="100%">Lunar geology Periodicals</style></keyword></keywords><dates><year><style face="normal" font="default" size="100%">1974</style></year></dates><pub-location><style face="normal" font="default" size="100%">Washington, D.C.</style></pub-location><publisher><style face="normal" font="default" size="100%">American Geophysical Union</style></publisher><isbn><style face="normal" font="default" size="100%">0094-8276</style></isbn><call-num><style face="normal" font="default" size="100%">QE500 .G37</style></call-num><notes><style face="normal" font="default" size="100%">Description based on: vol. 13, no. 4, Apr. 1986.&#xD;Semimonthly, 1992-&#xD;Monthly, -1991</style></notes><work-type><style face="normal" font="default" size="100%">serial</style></work-type><urls></urls></record> 

Jede Hilfe zu dieser Adressierung Problem wird sehr geschätzt.

Antwort

1

Hier ist ein Beispiel, wie Sie durch Ihre XML navigieren können.

SELECT 
    t.record.value('(database/@name)[1]','varchar(100)') 
    , t.record.value('(database/@path)[1]','varchar(100)') 
    , t.record.value('(foreign-keys/key/@app)[1]','varchar(100)') 
    , t.record.query('titles') 
    , ca.titles.value('(.)[1]','varchar(100)') 
FROM @xml.nodes('record') t(record) 
CROSS APPLY t.record.nodes('titles/title') AS ca(titles) 

Ich verwende .value, um einzelne Werte aus XML zu holen. Wenn Sie wissen, dass ein Element nur einmal pro Datensatz angezeigt wird, wie z. B. eine Datenbank, können Sie es sicher verwenden, ohne Daten zu verlieren.

.query gibt einen Teil Ihrer XML-Datei zurück, die an diesem Speicherort gefunden wurde. Sie können damit mehrere Elemente in einer Zeile abrufen.

CROSS APPLY geht weiter in Ihre Aufzeichnungen, verbindet jeden Titel mit seinem Elternteil einmal, wenn Sie mehrere Titel pro Datensatz hatten, würden Sie eine Zeile für jeden Titel bekommen.

Sie verwenden also "@name" zum Abrufen von Attributen und nur "name" zum Abrufen von Elementen.

p.s. Ich bin mir nicht sicher über den genauen Unterschied zwischen OpenXML und XQuery, aber ich habe immer XQuery verwendet.

+1

Sehr nette Antwort! [Hier finden Sie Informationen zu OpenXML und XQuery] (http://beyondrelational.com/quiz/sqlserver/general/2010/questions/sqlserver-quiz-general-2010-jacob-sebastian-openxml-or-xquery-when-and- why.aspx) – Shnugo

+0

@Bistabil sieht vernünftig aus, danke ich werde das versuchen. –

Verwandte Themen