[英]Insert data in to table using xml and stored procedure in SQL Server 2008
[英]insert xml data to table stored procedure sql server
我有以下格式的xml
<Entity>
<name>John</name>
<aliases><alias>Johnny</alias></aliases>
<aliases><alias>Johnson</alias></aliases>
</Entity>
<Entity>
<name>Smith</name>
<aliases><alias>Smithy</alias></aliases>
<aliases><alias>Schmit</alias></aliases>
</Entity>
我想将它们插入表中,因此该表在示例中应该有 4 条记录。
列是名称和别名。
name | alias
John | Johnny
John | Johnson
Smith| Smithy
Smith| Schmit
如何使用游标或其他方式实现此目的?
我试过的。 在实体的光标中,我尝试插入别名值,但只采用第一个别名。
insert into TESTTABLE
(EntityID,Alias)
select
@EntityID as EntityID,
Alias
from OpenXml(@ixml, '/Aliases',2)
with (
Alias varchar(255) '.'
)
DECLARE @XML AS XML= N'
<Entity>
<name>John</name>
<aliases><alias>Johnny</alias></aliases>
<aliases><alias>Johnson</alias></aliases>
</Entity>
<Entity>
<name>Smith</name>
<aliases><alias>Smithy</alias></aliases>
<aliases><alias>Schmit</alias></aliases>
</Entity>'
INSERT INTO @tblTest(firstName,LastName)
SELECT t1.c.value('../name[1]','varchar(100)') As FirstName,t1.c.value('alias[1]','varchar(50)') as SecondName
FROM @xml.nodes('/Entity/aliases') t1(c)
首先:没有很好地形成你的XML作为它缺少一个根节点。 SQL-server 可以处理 XML 片段,但其他引擎可能会失败......
您有一个1:n
相关的两级层次结构。 最好使用.nodes()
级联查询:
DECLARE @XML AS XML=
N'<Entity>
<name>John</name>
<aliases>
<alias>Johnny</alias>
</aliases>
<aliases>
<alias>Johnson</alias>
</aliases>
</Entity>
<Entity>
<name>Smith</name>
<aliases>
<alias>Smithy</alias>
</aliases>
<aliases>
<alias>Schmit</alias>
</aliases>
</Entity>'
-- 查询将使用.nodes()
获取所有实体,第二次使用.nodes()
获取每个实体下别名的派生表。
SELECT A.ent.value('(name/text())[1]','varchar(100)') As FirstName
,B.ali.value('(alias/text())[1]','varchar(50)') as SecondName
FROM @xml.nodes('/Entity') A(ent)
CROSS APPLY A.ent.nodes(N'aliases') AS B(ali);
根据下面的一条评论,我对此进行了一些更改以反映具有属性的多个别名。
DECLARE @XML AS XML=
N'<Entity>
<name>John</name>
<aliases>
<alias nr="1">Johnny</alias>
<alias nr="2">OneMore</alias>
</aliases>
<aliases>
<alias>Johnson</alias>
</aliases>
</Entity>
<Entity>
<name>Smith</name>
<aliases>
<alias nr="1">Smithy</alias>
</aliases>
<aliases>
<alias nr="1">Schmit</alias>
</aliases>
</Entity>'
SELECT A.ent.value('(name/text())[1]','varchar(100)') As FirstName
,B.ali.value('@nr','int') as SomeAttribute
,B.ali.value('text()[1]','varchar(50)') as SecondName
FROM @xml.nodes('/Entity') A(ent)
CROSS APPLY A.ent.nodes(N'aliases/alias') AS B(ali);
发生了什么变化?
.nodes()
比/alias
更深一层,因此在多行中重复多个别名。@
的属性
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.