2016-04-24 28 views
1

XMLファイルをSQL Serverにインポートする方法については、メンバーが投稿したan exampleに従います。xmlファイルをSQL Serverにインポートするスクリプト

しかし、以下に示すように、xmlファイルのタグ内にいくつかのタグがあります。例えば、私のようなタグを参照する方法を確認していない:以下、私のSQLスクリプトで

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

を3つの観測

<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> 

これを対処する上で任意のヘルプが含まれていると私が取り扱っておりますサンプルXMLファイルであります問題は非常に高く評価されています。

答えて

1

ここでは、XMLを操作する方法の例を示します。

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) 

私はXMLから単一の値をフェッチするために.valueを使用しています。 1つの要素がデータベースのようにレコードごとに1回しか表示されないことが分かっている場合は、データを紛失することなく安全に使用できます。

.queryは、その場所にあるXMLの一部を返します。これを使用すると、1行に複数の要素を取得できます。

CROSS APPLYはあなたのレコードにさらに進んで、各タイトルをその親と一緒に結合します。レコードごとに複数のタイトルがある場合は、各タイトルごとに1行ずつ表示されます。

属性をフェッチするのに "@name"を使用し、要素をフェッチするには "名前"のみを使用します。

p.s.私はOpenXMLとXQueryの正確な違いについてはわかりませんが、私はいつもXQueryを使ってきました。

+1

非常にいい回答です! [ここにOpenXMLと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は妥当と思われます、ありがとう、私はこれを試してみます。 –

関連する問題