вставить данные XML в таблицу хранимой процедуры SQL Server - PullRequest
0 голосов
/ 28 мая 2018

У меня есть 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 голосов
/ 28 мая 2018

Прежде всего: ваш XML не является правильно сформированным , поскольку в нем отсутствует корневой узел.SQL-сервер может работать с 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);
0 голосов
/ 28 мая 2018
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)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...