【问题标题】:Script to import xml file into SQL Server将 xml 文件导入 SQL Server 的脚本
【发布时间】:2023-03-04 12:44:02
【问题描述】:

我正在关注an example 一位成员发布的关于如何将 XML 文件导入 SQL Server 的帖子。

但是,我的 xml 文件中的标签中有一些标签,如下所示。例如,我不确定如何引用如下标签:

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

在我的 SQL 脚本中,下面是我正在处理的示例 xml 文件,其中包含 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>

非常感谢任何有关解决此问题的帮助。

【问题讨论】:

    标签: sql-server xml bulkinsert


    【解决方案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)
    

    我正在使用 .value 从 XML 中获取单个值。如果您知道一个元素每条记录只会出现一次,例如数据库,那么您可以安全地使用它而不会丢失任何数据。

    .query 将返回在该位置找到的部分 XML,您可以使用它来获取一行中的多个元素。

    CROSS APPLY 进一步进入您的记录,将每个标题与其父级连接一次,如果每条记录有多个标题,则每个标题对应一行。

    所以你使用“@name”来获取属性,而只使用“name”来获取元素。

    附言我不确定 OpenXML 和 XQuery 之间的确切区别,但我一直使用 XQuery。

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-07-15
    • 1970-01-01
    • 2015-06-08
    • 2013-05-26
    • 2023-03-16
    • 2013-10-18
    • 1970-01-01
    相关资源
    最近更新 更多