2010-11-05 55 views
1

我一直在使用下面的代码SQL Server 2008中 - XML文件的导入部分

INSERT 
    INTO import.XMLCompanyDetail 
    (
    XMLData 
    ) 

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

导入整个XML文件到一个临时表与XML数据类型然而正是我努力做的不仅是导入部分数据,请参阅下面的例子XML。理想情况下,我想要选择CoNum 123或CoNum 233并获取该元素中的其余数据。虽然我认为这意味着以某种方式得到relvent 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 

回答

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的是假表您感兴趣的相关信息。

+0

欢呼的答复,这基本上是我在后面的过程中使用的语法。基本上上面的代码是在我的SP中,然后多个其他SP使用您的上述代码将各种值切分到其他表中。所以我真的需要为指定的COnum选择CONum,COname和DIC。或者将所有数据选择到import.XMLCompanyDetail并删除所有与未指定的CONum有关的其他信息。 Unfortuantley当我运行我的示例导入时,我不知道RowNumber,只有CONum,很多再次感谢。 – Pixelated 2010-11-05 16:40:28