将XML数据加载到SQL Server中,采用特殊的XML结构

时间:2012-07-12 15:06:51

标签: sql-server xml xquery bulkinsert

我正在尝试将XML数据加载到SQL Server表中。

XML文件是:

<root>
   <Company ID="183">
      <User UserName="Kim" />
      <User UserName = "Joe" />
   </Company>
 <Company ID="123">
      <User UserName="George" />
      <User UserName = "Sal" />
   </Company>
</root>

我想获得一个包含公司ID和UserName的UserName表。 对于这个例子:

ID      UserName
---     --------
183     Kim
183     Joe
123     George
123     Sal

我尝试了一些方法,例如循环遍历每个公司的所有用户名,但这非常复杂,尤其是当我有超过2层以适合此解决方案时。

我尝试的另一件事是:

SELECT
t.c.query('./UserName').value('.','varchar(20)') AS A ,
(
    SELECT
    t1.c1.value('@ID', 'varchar(10)')
    FROM @x.nodes('/root/Company')AS t1(c1)
)
FROM @x.nodes('/root/Company/User')AS t(c)

但是我得到一个错误,即子查询的值超过1。

有什么建议吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

假设你说 SQL ,但你的意思是 SQL Server - 尝试这样的事情:

DECLARE @input XML = '<root>
   <Company ID="183">
      <User UserName="Kim" />
      <User UserName = "Joe" />
   </Company>
 <Company ID="123">
      <User UserName="George" />
      <User UserName = "Sal" />
   </Company>
</root>'

SELECT
    CompanyID = Comp.value('(@ID)[1]', 'int'),
    UserName = USerTbl.value('(@UserName)[1]', 'varchar(50)')
FROM 
    @input.nodes('/root/Company') T(Comp)
CROSS APPLY
    Comp.nodes('User') AS T2(UserTbl)

这给了我正在寻找的输出。