Это очень некрасиво (для меня), но это можно сделать с помощью временных таблиц. Временная таблица видна всем подпрограммам в текущей области.
Таким образом, вы можете иметь вложение следующим образом:
EXEC SP1
...
EXEC SP2
...
EXEC SP3
...
и, скажем, EXEC SP2
возвращает набор строк, выполняющий инструкцию SELECT
. Итак, вопрос в том, как его материализовать?
CREATE PROCEDURE dbo.SP1
AS
BEGIN;
SELECT 'SP1' AS [Caller];
EXEC dbo.SP2;
END;
GO
CREATE PROCEDURE dbo.SP2
AS
BEGIN;
SELECT 'SP2' AS [Caller];
INSERT INTO #TEST
SELECT 1;
END;
GO
CREATE TABLE #TEST
(
[ID] INT
);
EXEC dbo.SP1;
SELECT *
FROM #TEST;
Идея состоит в том, чтобы создать временную таблицу во внешней области видимости и процедуру, чтобы убедиться, что эта таблица уже создана, и заполнить ее. Затем используйте таблицу в исходной вызывающей стороне.
Это уродливо для меня, потому что, если эта таблица не определена, процедура вызовет ошибку:
Сообщение 208, Уровень 16, Состояние 0, Процедура dbo.SP2, строка 8[Batch Start Line 0] Недопустимое имя объекта '#TEST'.
, и в некоторых случаях отладка может быть затруднена.