sql - 按照与 XML 相同的顺序将 XML 元素插入 SQL 表中?

标签 sql sql-server xml sql-server-2012

我正在将 XML 文件传输到 SQL TABLES - 我正在使用 SQL Server Management Studio 2012。我试图将 XML 元素插入到与 XML 文件中相同的顺序。

例如 XML 代码是:

<form>
  <ItemType>New Regular</ItemType>
  <FirstBuyDate>02/01/2007</FirstBuyDate>
  <FirstShipDate>02/05/2007</FirstShipDate>
  <ItemBrand>Gillette Blade/Razors</ItemBrand>
  <ItemDescription>...</ItemDescription>
  <Size>8.00</Size>
  <InnerOffInvoice />
  <MasterOffInvoice />
  <PalletItems>
  <ID>908402</ID> 
  <PalletShipDate>04/03/13</PalletShipDate>
  </PalletItems>
  <ReviewComments />
</form> 

关于我项目的这个特定部分。我正在从 XML 文件中提取列名称。我使用 (/form/*) 只提取 XML 列名称并将其放入表中。然而,我正在努力解决的问题是如何按照 XML 文件中的相同顺序插入 xml 元素。目前它们被随机插入到列中:

    Items
1. FirstBuyDate
2. Size
3. ItemType
4. PalletItems... etc. 

我想成为这样的人:

    Items
1. ItemType
2. FirstBuyDate 
3. FirstShipDate
4. ItemBrand... etc. 

我添加了这一行 ('for $i in . return count(../*[. << $i])', 'int')试图对他们进行计数。它有点有效......但是它重复了一些数字。我不知道为什么?你们中有人能帮我吗?

SELECT distinct Parent.Items.value('for $i in . return count(../*[. << $i])', 'int') as [Index],
Parent.Items.value('local-name(../.)', 'varchar(100)') as 'ParentItem',
    Parent.Items.value('local-name(.)', 'varchar(100)') as 'ChildItem'
FROM    dbo.FormResults
CROSS APPLY xmlformfields.nodes('/form/*')  as Parent(Items)
order by ParentItem, [Index]

请参阅此处 - 我收到重复的索引号 - 你知道为什么吗?

enter image description here

谢谢!!

添加了以下代码实现建议:

declare @YourNumberTable table (n int primary key);
insert into @YourNumberTable
select top 100 row_number()over(order by number) from master..spt_values;

SELECT distinct 
Parent.Items.value('local-name(../.)', 'varchar(100)') as 'ParentItem',
Parent.Items.value('local-name(.)', 'varchar(100)') as 'ChildItem'
FROM    dbo.FormResults
CROSS APPLY xmlformfields.nodes('/form/*')  as Parent(Items)

select  [position] = n.n,
        [nodeName] = p.n.value('local-name(.)[1]', 'varchar(max)')
from    @YourNumberTable n
cross apply   FormResults.xmlformfields.nodes('/form/*[position()=sql:column("n")]') p(n)
where   n.n <= FormResults.xmlformfields.value('count(/form/*)', 'int');

我不知道如何合并这两个表?

最佳答案

您可以使用数字表来附加节点位置。然后将此位置与您的插入件一起使用。

declare @YourNumberTable table (n int primary key);
insert into @YourNumberTable
    select top 100 row_number()over(order by number) from master..spt_values;


declare @x xml;
set @x = '<form>
  <ItemType>New Regular</ItemType>
  <FirstBuyDate>02/01/2007</FirstBuyDate>
  <FirstShipDate>02/05/2007</FirstShipDate>
  <ItemBrand>Gillette Blade/Razors</ItemBrand>
  <ItemDescription>...</ItemDescription>
  <Size>8.00</Size>
  <InnerOffInvoice />
  <MasterOffInvoice />
  <PalletItems>
  <ID>908402</ID> 
  <PalletShipDate>04/03/13</PalletShipDate>
  </PalletItems>
  <ReviewComments />
</form>';

select  [position] = n.n,
        [nodeName] = p.n.value('local-name(.)[1]', 'varchar(max)')
from    @YourNumberTable n
cross
apply   @x.nodes('/form/*[position()=sql:column("n")]') p(n)
where   n.n <= @x.value('count(/form/*)', 'int');

编辑:由于您的 XML 存储为列,因此您可以以大致相同的方式访问:

declare @FormResults table (Id int primary key, xmlformfields xml);
insert into @FormResults
    select 1, '<form><ItemType>New Regular</ItemType><FirstBuyDate>02/01/2007</FirstBuyDate><FirstShipDate>02/05/2007</FirstShipDate><ItemBrand>Gillette Blade/Razors</ItemBrand></form>' union all
    select 2, '<form><one>Hello</one><two>World</two></form>'

select  [Id] = fr.Id,
        [Position] = n.n,
        [ParentNodeName] = p.n.value('local-name(..)[1]', 'varchar(max)'),
        [NodeName] = p.n.value('local-name(.)[1]', 'varchar(max)')
from    @FormResults fr
join    @YourNumberTable n on 
        fr.xmlformfields.value('count(/form/*)', 'int') >= n.n
cross
apply   fr.xmlformfields.nodes('/form/*[position()=sql:column("n")]') p(n)

关于sql - 按照与 XML 相同的顺序将 XML 元素插入 SQL 表中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24089024/

相关文章:

sql - PostgreSQL - "DISTINCT ON"和 "GROUP BY"语法

sql - 我将如何在 Rails 中执行此 JOIN 操作?

c# - 连接本地数据库 mdf Visual Studio

sql-server - Amazon EC2 Sql 性能

sql-server - 在 SQL Server 中查看存储在 Varbinary(MAX) 中的文件

java - 使用 jSTL 显示数据表

android - 每 x 分钟通过 android 设备将更新的 GPS 坐标自动发送到 Web 服务器

php - 如何在php中的父节点添加xml

jquery - 选择最后一个直系子项

regex - 如何从 XSLT 2.0 中的字符串中选择特定部分