我有以下格式的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) '.'
)
答案 0 :(得分:2)
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)
答案 1 :(得分:0)
首先:您的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);