Если хранимая процедура представляет собой простую вставку в таблицу People, вы можете создать новую хранимую процедуру, например:
CREATE PROCEDURE dbo.Insert_People_From_XML
@people_xml XML
AS
BEGIN
INSERT INTO dbo.People
(
id,
first_name,
last_name,
middle_initial
)
SELECT
Node.value('Id[1]', 'Int'),
Node.value('FirstName[1]', 'varchar(50)'),
Node.value('LastName[1]', 'varchar(50)'),
Node.value('MI[1]', 'char(1)')
FROM
@people_xml.nodes('/ArrayOfPeople/Person') TempXML (Node)
END
Если у вас есть бизнес-логика (или другая логика, которая вам не нужнадублировать), то вы можете повторно использовать хранимую процедуру вставки, как она есть.В этом случае вам придется перебирать узлы XML.Как бы я ни старался избегать курсоров, самое время использовать один из них:
DECLARE
@id INT,
@first_name VARCHAR(50),
@last_name VARCHAR(50),
@middle_initial CHAR(1)
DECLARE people_cursor CURSOR FOR
SELECT
Node.value('Id[1]', 'Int'),
Node.value('FirstName[1]', 'varchar(50)'),
Node.value('LastName[1]', 'varchar(50)'),
Node.value('MI[1]', 'char(1)')
FROM
@people_xml.nodes('/ArrayOfPeople/Person') TempXML (Node)
OPEN people_cursor
FETCH NEXT FROM people_cursor INTO @id, @first_name, @last_name, @middle_initial
WHILE (@@FETCH_STATUS = 0)
BEGIN
EXEC Your_Proc
@id = @id,
@first_name = @first_name,
@last_name = @last_name,
@middle_initial = @middle_initial
FETCH NEXT FROM people_cursor INTO @id, @first_name, @last_name, @middle_initial
END
CLOSE people_cursor
DEALLOCATE people_cursor
ПРИМЕЧАНИЕ: Все это было написано на моей голове.Я не очень часто использую XML, поэтому, возможно, потребуется исправить синтаксис, вы захотите добавить обработку ошибок и т. Д.