jjzjj

sql - 将 XML 导入 SQL Server,分成多行

coder 2024-07-01 原文

我有一个 XML 文件,我需要将其导入到 SQL Server 数据库中。 XML 文件是这样构建的:

<report>
  <deltagere>
    <deltager>
    <number>142555267</number>
    <date>29-12-2006</date>
    <name>
      <name>
        <from>01-05-2000</from>
        <to>01-01-2003</to>
        <text>foo</text>
      </name>
      <name>
        <from>01-01-2003</from>
        <to>29-12-2006</to>
        <text>bzz</text>
      </name>
    </name>
    <information>
      <deltagertype>person</deltagertype>
      <leader>John Smith</leader>
      <status>Active</status>
    </information>
    <role>Responsible</role>
    </deltager>
    <deltager>
      <number>4000134982</number>
      <date>05-12-2007</date>
      <name>
        <name>
          <from>07-07-2007</from>
          <to>05-12-2007</to>
          <text>bar</text>
        </name>
      </name>
      <information>
        <deltagertype>person</deltagertype>
        <leader>Wolfgang Smith</leader>
        <status>Active</status>
      </information>
      <role>Responsible</role>
    </deltager>
    ...
  </deltagere>
</report>

如您所见,名称属性可以包含多个名称。我已经设法将 XML 导入我的数据库,但只有名字属性。 到目前为止我写的代码是:

DECLARE @XmlFile XML

SELECT @XmlFile = BulkColumn
FROM  OPENROWSET(BULK 'C:\input.xml', SINGLE_BLOB) x;

INSERT INTO dbo.deltagere(number, dato, nameFrom, nameTo, nameText, deltagertype, leader, deltagerStatus, deltagerRole)
SELECT
  number = deltagere.value('(number)[1]', 'bigint'),
  dato = deltagere.value('(date)[1]', 'varchar(10)'),
  nameFrom = deltagere.value('(name/name/from)[1]', 'varchar(10)'),
  nameTo = deltagere.value('(name/name/to)[1]', 'varchar(10)'),
  nameText = deltagere.value('(name/name/text)[1]', 'varchar(30)'),
  deltagertype = deltagere.value('(information/deltagertype)[1]', 'varchar(20)'),
  leader = deltagere.value('(information/leader)[1]', 'varchar(50)'),
  deltagerStatus = deltagere.value('(information/status)[1]', 'varchar(50)'),
  deltagerRole = deltagere.value('(role)[1]', 'varchar(50)')
FROM
  @XmlFile.nodes('/report/deltagere/deltager') AS XTbl(deltagere);

这给了我这个输出:

| number     | dato       | nameFrom   | nameTo     | nameText | deltagertype | ...
| 142555267  | 29-12-2006 | 01-05-2000 | 01-01-2003 | foo      | person       | ...
| 4000134982 | 05-12-2007 | 07-07-2007 | 05-12-2007 | bar      | person       | ...

我想为每个名字/名字排一行。所以像这样:

-------------------------------------------------------
| number     | dato       | nameFrom   | nameTo     | nameText | deltagertype | ...
| 142555267  | 29-12-2006 | 01-05-2000 | 01-01-2003 | foo      | person       | ...
| 142555267  | 29-12-2006 | 01-01-2003 | 29-12-2006 | bzz      | person       | ...
| 4000134982 | 05-12-2007 | 07-07-2007 | 05-12-2007 | bar      | person       | ...

等等。

我真的不知道该怎么做。因此,我希望你们中的任何人对如何修改我的代码以允许这个问题有任何想法,或者可能对这个问题采取不同的方法。

最佳答案

试试这个 - 你需要再做一次 .nodes()调用枚举所有<name>子节点:

SELECT
    number = deltagere.value('(number)[1]', 'bigint'),
    dato = deltagere.value('(date)[1]', 'varchar(10)'),
    -- NEW NEW NEW - read from `XC` pseudo columns to get 1-n names
    nameFrom = XC.value('(from)[1]', 'varchar(10)'),
    nameTo = XC.value('(to)[1]', 'varchar(10)'),
    nameText = XC.value('(text)[1]', 'varchar(30)'),
    deltagertype = deltagere.value('(information/deltagertype)[1]', 'varchar(20)'),
    leader = deltagere.value('(information/leader)[1]', 'varchar(50)'),
    deltagerStatus = deltagere.value('(information/status)[1]', 'varchar(50)'),
    deltagerRole = deltagere.value('(role)[1]', 'varchar(50)')
FROM
    @XmlFile.nodes('/report/deltagere/deltager') AS XTbl(deltagere)
CROSS APPLY
    deltagere.nodes('name/name') AS XT2(XC)

关于sql - 将 XML 导入 SQL Server,分成多行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29372259/

有关sql - 将 XML 导入 SQL Server,分成多行的更多相关文章

  1. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

  2. ruby-on-rails - 如何在 ruby​​ 交互式 shell 中有多行? - 2

    这可能是个愚蠢的问题。但是,我是一个新手......你怎么能在交互式ruby​​shell中有多行代码?好像你只能有一条长线。按回车键运行代码。无论如何我可以在不运行代码的情况下跳到下一行吗?再次抱歉,如果这是一个愚蠢的问题。谢谢。 最佳答案 这是一个例子:2.1.2:053>a=1=>12.1.2:054>b=2=>22.1.2:055>a+b=>32.1.2:056>ifa>b#Thecode‘if..."startsthedefinitionoftheconditionalstatement.2.1.2:057?>puts"f

  3. ruby - 检查是否通过 require 执行或导入了 Ruby 程序 - 2

    如何检查Ruby文件是否是通过“require”或“load”导入的,而不是简单地从命令行执行的?例如:foo.rb的内容:puts"Hello"bar.rb的内容require'foo'输出:$./foo.rbHello$./bar.rbHello基本上,我想调用bar.rb以不执行puts调用。 最佳答案 将foo.rb改为:if__FILE__==$0puts"Hello"end检查__FILE__-当前ruby​​文件的名称-与$0-正在运行的脚本的名称。 关于ruby-检查是否

  4. Hive SQL 五大经典面试题 - 2

    目录第1题连续问题分析:解法:第2题分组问题分析:解法:第3题间隔连续问题分析:解法:第4题打折日期交叉问题分析:解法:第5题同时在线问题分析:解法:第1题连续问题如下数据为蚂蚁森林中用户领取的减少碳排放量iddtlowcarbon10012021-12-1212310022021-12-124510012021-12-134310012021-12-134510012021-12-132310022021-12-144510012021-12-1423010022021-12-154510012021-12-1523.......找出连续3天及以上减少碳排放量在100以上的用户分析:遇到这类

  5. sql - 查询忽略时间戳日期的时间范围 - 2

    我正在尝试查询我的Rails数据库(Postgres)中的购买表,我想查询时间范围。例如,我想知道在所有日期的下午2点到3点之间进行了多少次购买。此表中有一个created_at列,但我不知道如何在不搜索特定日期的情况下完成此操作。我试过:Purchases.where("created_atBETWEEN?and?",Time.now-1.hour,Time.now)但这最终只会搜索今天与那些时间的日期。 最佳答案 您需要使用PostgreSQL'sdate_part/extractfunction从created_at中提取小时

  6. sql - 在 Rails Console for PostgreSQL 的表中显示数据 - 2

    我找到了这样的东西:Rails:Howtolistdatabasetables/objectsusingtheRailsconsole?这一行没问题:ActiveRecord::Base.connection.tables并返回所有表但是ActiveRecord::Base.connection.table_structure("users")产生错误:ActiveRecord::Base.connection.table_structure("projects")我认为table_structure不是Postgres方法。如何列出Postgres数据库的Rails控制台中表中的所有

  7. ruby - Sublime Text 3 多行法折叠 - 2

    所以...SublimeText具有折叠方法的内置功能,但是一旦方法声明跨越多行,它就会失去这种能力。有谁知道插件或使它工作的方法吗?具体来说,我在使用ruby​​时遇到了这个问题(我的团队遵守关于行长度的严格风格指南),但语言应该无关紧要。 最佳答案 无需单击出现在函数定义第一行旁边的装订线中的向下箭头,您需要做的就是将光标放在函数的一个缩进行上(不是缩进的函数参数,而是在函数定义本身)并使用CtrlShift[键绑定(bind)(在OSX上使用⌘Alt[)折叠函数及其参数。使用CtrlShift](⌘Alt]在OSX上)展开,或

  8. ruby-on-rails - Dotenv 多行变量 - 2

    我正在使用dotenv.ARubygemtoloadenvironmentvariablesfrom.env.我的.env文件中是否可以包含多行变量?例如SOMETHING_CERTIFICATE="-----BEGINCERTIFICATE-----JSDFALDAFSSKLABVCXZLV2314IH4IHDFG9AYDF9DSSDF82QWEIWFHDSSD8SADF0=-----ENDCERTIFICATE-----"^上面的内容只会在中间那一行抛出一个错误,就好像它不是字符串的一部分,我正在尝试创建一个格式不正确的变量。 最佳答案

  9. ruby - 防止SQL注入(inject)/好的Ruby方法 - 2

    Ruby中防止SQL注入(inject)的好方法是什么? 最佳答案 直接使用ruby?使用准备好的语句:require'mysql'db=Mysql.new('localhost','user','password','database')statement=db.prepare"SELECT*FROMtableWHEREfield=?"statement.execute'value'statement.fetchstatement.close 关于ruby-防止SQL注入(inject

  10. Ruby:如何从另一个文件导入变量? - 2

    我正在尝试创建一个与compass一起使用的本地配置文件,这样我们就可以处理开发人员机器上的不同导入路径。到目前为止,我已经尝试将文件导入到异常block中,以防它不存在,然后进一步使用该变量:local_config.rbVENV_FOLDER='venv'config.rbVENV_FOLDER='.'beginrequire'local_config.rb'rescueLoadErrorendputsVENV_FOLDER通常我是一名Python开发人员,所以我希望导入将VENV_FOLDER的值更改为venv,但它仍然是。之后。有没有一种方法可以导入local_config.r

随机推荐