Script pour importer le file xml dans SQL Server

Je suis un exemple publié par un membre sur la façon d'importer des files XML dans SQL Server.

Cependant j'ai quelques labels dans une label dans mon dossier de xml comme montré ci-dessous. Par exemple, je ne suis pas sûr de savoir comment referencer des tags comme:

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

dans mon script SQL, ci-dessous est l'exemple de file XML que je traite qui contient 3 observations

 <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> <consortingbutors></consortingbutors> <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><consortingbutors></consortingbutors><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><consortingbutors></consortingbutors><auth-address><style face="normal" font="default" size="100%">American Geophysical Union, 1909 K St. NW, 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, DC</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.
Semimonthly, 1992-
Monthly, -1991</style></notes><work-type><style face="normal" font="default" size="100%">serial</style></work-type><urls></urls></record> 

Toute aide pour résoudre ce problème est très appréciée.

Voici un exemple de navigation dans votre file 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) 

J'utilise .value pour récupérer des valeurs uniques à partir de XML. Si vous savez qu'un élément n'apparaîtra qu'une seule fois par logging, comme la database, vous pouvez l'utiliser sans risque de manquer des données.

.query returnnera une partie de votre XML qui se trouve sur cet location, vous pouvez l'utiliser pour aller chercher plusieurs éléments dans une ligne.

CROSS APPLY va plus loin dans vos loggings, joint chaque titre avec son parent une fois, si vous avez plusieurs titres par logging, vous obtiendrez une rangée pour chaque titre.

Donc vous utilisez "@name" pour récupérer les attributes et seulement "name" pour récupérer les éléments.

ps Je ne suis pas sûr de la différence exacte entre OpenXML et XQuery, mais j'ai toujours utilisé XQuery.