Подтвердить что ты не робот

Можно ли использовать хранимую процедуру в качестве подзапроса в SQL Server 2008?

У меня есть две хранимые процедуры, одна из которых возвращает список платежей, а другая возвращает сводку этих платежей, сгруппированных по валюте. Прямо сейчас у меня есть дублированный запрос: основной запрос хранимой процедуры, возвращающий список платежей, является подзапросом хранимой процедуры, которая возвращает сводку платежей по валюте. Я хотел бы устранить эту двуличность, сделав хранимую процедуру, которая возвращает список платежей в подзапрос хранимой процедуры, которая возвращает сводку платежей по валюте. Возможно ли это в SQL Server 2008?

4b9b3361

Ответ 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

Я бы использовал представление, если оно не нужно параметризовать, и в этом случае я бы использовал встроенную функцию табличной оценки, если это возможно, если только это не должно быть операцией с несколькими операторами, где вы все равно можете использовать таблицу, но они обычно менее эффективны.