Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
Речь пойдет о методах получения результатов работы процедуры в виде таблиц для последующей работы с ними в SQL.
Мне в таких случаях всегда хочется спросить: а зачем? Нельзя ли перестроить задачу таким образом, чтобы это перестало быть нужным?
Ну и да, почему просто не использовать табличную функцию?
Почему нельзя использовать табличную функцию?
P.S. Табличные функции — удобно. Но по доброй традиции, в MS SQL есть серьезные ограничения (по сравнению с хранимыми процедурами) на использование функций.
CREATE TYPE [dbo].[t_Docs] AS TABLE(
[NOMDOC] [varchar](10) NOT NULL,
[CFO] [varchar](2) NULL,
[DEP] [varchar](3) NULL,
[VIDDOC] [varchar](5) NULL,
[MEMBER] [varchar](5) NULL,
[MEMBER2] [varchar](5) NULL,
[CALCMEMBER] [varchar](5) NULL,
[SUMMA] [numeric](15, 2) NULL,
[SUMMA0] [numeric](15, 2) NULL,
PRIMARY KEY CLUSTERED
(
[NOMDOC] ASC
)WITH (IGNORE_DUP_KEY = OFF)
)
GO
DECLARE @Docs AS t_Docs
-- Создаем таблицу
SELECT *
INTO #Docs
FROM @Docs
INSERT INTO @Docs
EXEC Proc1
INSERT INTO #Docs
EXEC Proc1
В табличные переменные нельзя вставить данные внутри процедуры, однако INSERT...EXEC вполне работает. Зачастую достаточно и их. Когда недостаточно — используем следующий трик:
-- Создаем таблицу SELECT * INTO #Docs FROM @Docs
… и вот у нас таблица нужной нам структуры.
-- Создаем таблицу
SELECT *
INTO #Docs
FROM @Docs
INSERT INTO @Docs
EXEC Proc1
create procedure Proc1
as
begin
select 1 p1, 'b' p2
end
Передача табличных данных из хранимой процедуры