我正在将 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]
请参阅此处 - 我收到重复的索引号 - 你知道为什么吗?
谢谢!!
添加了以下代码实现建议:
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/