Если вам действительно нужен итеративный подход (процедура уже написана, вы выполняете несколько NON- SQL заданий), CURSOR - это опция:
CREATE PROCEDURE ProcessStatut(@statut varchar(50), @nom varchar(50),@commentaire varchar(50)) AS
BEGIN
SELECT @statut Statut, @nom Nom, @commentaire Commentaire, 'Hello world!' Hello
END
Тогда:
DECLARE @statut varchar(50), @nom varchar(50),@commentaire varchar(50);
DECLARE c CURSOR FOR
SELECT
b.value('(./Statut/text())[1]','Varchar(50)') as Statut,
b.value('(./Nom/text())[1]','Varchar(50)') as Nom,
b.value('(./Commentaire/text())[1]','Varchar(50)') as Commentaire
FROM @xml.nodes('/ArrayOfRDHistorique/RDHistorique/ListeEtapes/*') as a(b)
OPEN c
FETCH NEXT FROM c INTO @statut, @nom, @commentaire
WHILE @@FETCH_STATUS = 0
BEGIN
EXEC ProcessStatut @statut, @nom, @commentaire
FETCH NEXT FROM c INTO @statut, @nom, @commentaire
END
CLOSE c
DEALLOCATE c
Каждая строка будет обрабатываться отдельно.
Редактировать 1: Если вам нужно передать таблицу, вы можете объявить тип TABLE:
CREATE TYPE StatutList AS TABLE (
Statut varchar(50),
Nom varchar(50),
Commentaire varchar(50)
)
GO
CREATE PROCEDURE ProcessStatutList(@statutList StatutList READONLY) AS
BEGIN
SELECT *, 'I was here!' Hello FROM @statutList
END
GO
И затем , используйте это, чтобы передать все предметы сразу:
DECLARE @statutList StatutList;
INSERT @statutList
SELECT
b.value('(./Statut/text())[1]','Varchar(50)') as Statut,
b.value('(./Nom/text())[1]','Varchar(50)') as Nom,
b.value('(./Commentaire/text())[1]','Varchar(50)') as Commentaire
FROM @xml.nodes('/ArrayOfRDHistorique/RDHistorique/ListeEtapes/*') as a(b)
EXEC ProcessStatutList @statutList;