Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将XML导入SQL Server,分成多行_Sql_Sql Server_Xml - Fatal编程技术网

将XML导入SQL Server,分成多行

将XML导入SQL Server,分成多行,sql,sql-server,xml,Sql,Sql Server,Xml,我有一个XML文件,需要将其导入SQL Server数据库。XML文件的构建方式如下: <report> <deltagere> <deltager> <number>142555267</number> <date>29-12-2006</date> <name> <name> <from>01-05-2000&

我有一个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>
-------------------------------------------------------
| 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       | ...
这给了我这个输出:

| 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       | ...
我想为每个名称/名称指定一行。比如说:

<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>
-------------------------------------------------------
| 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()
调用来枚举所有
子节点:

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)

你太棒了。这正是我所需要的。谢谢你也许你能帮我解决另一个问题。如果某些节点没有任何节点,该怎么办。然后插入0行。如果是这种情况,有没有办法只在名称列中写入NULL?