У меня есть две хранимые процедуры, одна из которых возвращает список платежей, а другая возвращает сводку этих платежей, сгруппированных по валюте. Прямо сейчас у меня есть дублированный запрос: основной запрос хранимой процедуры, возвращающий список платежей, является подзапросом хранимой процедуры, которая возвращает сводку платежей по валюте. Я хотел бы устранить эту двуличность, сделав хранимую процедуру, которая возвращает список платежей в подзапрос хранимой процедуры, которая возвращает сводку платежей по валюте. Возможно ли это в SQL Server 2008?
Можно ли использовать хранимую процедуру в качестве подзапроса в SQL Server 2008?
Ответ 1
Вам лучше преобразовать первый proc в функцию TABLE-VALUED. Если он включает несколько операторов, вам нужно сначала определить структуру таблицы возврата и заполнить ее.
Пример:
CREATE proc getRecords @t char(1)
as
set nocouut on;
-- other statements --
-- final select
select * from master..spt_values where type = @t
GO
- становится -
CREATE FUNCTION fn_getRecords(@t char(1))
returns @output table(
name sysname,
number int,
type char(1),
low int,
high int,
status int) as
begin
-- other statements --
-- final select
insert @output
select * from master..spt_values where type = @t
return
end;
Однако, если это прямой выбор (или может быть записан как один оператор), то вы можете использовать форму INLINE tvf, которая сильно оптимизирована
CREATE FUNCTION fn2_getRecords(@t char(1))
returns table as return
-- **NO** other statements; single statement table --
select * from master..spt_values where type = @t
Второй proc просто выбирает из первого proc
create proc getRecordsByStatus @t char(1)
as
select status, COUNT(*) CountRows from dbo.fn2_getRecords(@t)
group by status
И где вы звонили
EXEC firstProc @param
чтобы получить результат, вы теперь выбираете из него
SELECT * FROM firstProc(@param)
Ответ 2
Вставка результатов вашего сохраненного proc в таблицу или таблицу temp сделает трюк.
Если вы пытаетесь повторно использовать код в SQL Server от одного запроса к другому, у вас больше гибкости при использовании функций таблицы. При взгляде на них все в порядке, если вам не нужно передавать параметры или использовать какую-либо логику управления потоком. Они могут использоваться как таблицы в любой другой функции, процедуре, представлении или инструкции t-sql.
Ответ 3
Вы можете сделать вывод из хранимой процедуры в таблице temp, а затем использовать таблицу в своем основном запросе.
Захват вывода хранимой процедуры, возвращающей идентификаторы столбцов и Name в переменную таблицы.
declare @T table (ID int, Name nvarchar(50))
insert into @T
exec StoredProcedure
Ответ 4
Если вы сделали процедуру, которая возвращает список в функцию, ориентированную на таблицу, то я считаю, что вы можете использовать ее в подзапросе.
Ответ 5
Я бы использовал представление, если оно не нужно параметризовать, и в этом случае я бы использовал встроенную функцию табличной оценки, если это возможно, если только это не должно быть операцией с несколькими операторами, где вы все равно можете использовать таблицу, но они обычно менее эффективны.