将xml数据插入表存储过程sql server

时间:2018-05-28 08:23:46

标签: sql sql-server tsql

我有以下格式的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) '.'
        )   

2 个答案:

答案 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);