【问题标题】:SQL Server 2008 - Import part of XML FileSQL Server 2008 - 导入部分 XML 文件
【发布时间】:2010-11-05 16:06:08
【问题描述】:

我一直在使用以下代码将整个 XML 文件导入具有 XML 数据类型的临时表

   INSERT
   INTO import.XMLCompanyDetail
     (
     XMLData
     )

   SELECT BulkColumn AS XMLData
   FROM OPENROWSET (BULK '\\Server\Dir1\Dir2\Dir3\ExampleXML.xml', SINGLE_BLOB) AS XMLDATA

但是我正在努力做的只是导入部分数据,请参阅下面的 XML 示例。理想情况下,我想选择 CoNum 123 或 CoNum 233 并获取该元素中的其余数据。尽管我认为这意味着以某种方式获取相关的 Row num 并从那里开始工作。

<VN>
  <CompanyList>
    <Row num="1">
      <CoNum>123</CoNum>
      <CoName>Comp1</CoName>
      <DInc>1950-01-06</DInc>
    </Row>
    <Row num="2">
      <CoNum>233</CoNum>
      <CoName>Comp2</CoName>
      <DInc>1955-11-10</DInc>
      <DDis />
    </Row>
  </CompanyList>
</VN>

如果有人能以这种方式抛出一些语法或指出我正确的方向,那将不胜感激。

另外值得指出的是,我在该过程的后期将数据切碎到一个表中,但到那时它为时已晚,所以真的需要删除其余数据,或者只选择此查询中的相关数据或从import.XMLCompanyDetail 表。

更新 1:找到此链接 http://www.simple-talk.com/sql/t-sql-programming/xml-data-modification-language-workbench/ 应该会有所帮助。

更新 2:我最终编写了以下代码,可能不是最优雅的,但它似乎可以工作。花了十分钟的时间试图通过 sp_executeSQL 的参数传递变量,但无法让它工作,所以只是敲掉了下面的......将在直播前的某个时间添加 QUOTENAME。

                        SET @SQL = 
                                N'                                      
                                UPDATE  import.XMLCompanyDetail
                                SET     XMLData.modify(''delete (//VN/CompanyList/Row[@num != ' + CONVERT(VARCHAR,@RowNum) + '])'')
                                '

                        EXECUTE SP_EXECUTESQL   @SQL

【问题讨论】:

    标签: xml sql-server-2008 tags


    【解决方案1】:

    这样的事情怎么样:

    SELECT
        cd.ID, -- or something
        CL.Row.value('(CoNum)[1]', 'int') AS 'CoNum',
        CL.Row.value('(CoName)[1]', 'varchar(100)') AS 'CoName',
        CL.Row.value('(DInc)[1]', 'datetime') AS 'DInc'
    FROM
        import.XMLCompanyDetail cd
    CROSS APPLY
        cd.XMLData.nodes('/VN/CompanyList/Row') CL(ROW)
    WHERE
        CL.Row.value('(@num)', 'int') = 1
    

    基本上,您可以从 XML 中的 /VN/CompanyList/Row 条目列表中创建一个“伪表”CL.ROW,然后通过 XQuery 查询该伪表以获取您感兴趣的相关信息。

    【讨论】:

    • 为回复干杯,这基本上是我稍后在此过程中使用的语法。基本上,上面的代码在我的 SP 中,然后多个其他 SP 使用您上面的代码将各种值切碎到其他表中。所以我真的只需要为指定的 COnum 选择 CONum、COname 和 DIC。或者将所有数据选择到 import.XMLCompanyDetail 并删除与任何未指定的任何 CONum 相关的所有其他信息。不幸的是,当我运行示例导入时,我不知道 RowNumber,只知道 CONum,再次感谢。
    【解决方案2】:

    请参阅更新 2。

    【讨论】:

      猜你喜欢
      • 2011-11-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多