Как вернуть временную таблицу из хранимой процедуры
CREATE PROCEDURE [test].[proc]
@ConfiguredContentId int,
@NumberOfGames int
AS
BEGIN
SET NOCOUNT ON
RETURN
@WunNumbers TABLE (WinNumb int)
INSERT INTO @WunNumbers (WinNumb)
SELECT TOP (@NumberOfGames) WinningNumber
FROM [Game].[Game] g
JOIN [Game].[RouletteResult] AS rr ON g.[Id] = rr.[gameId]
WHERE g.[ConfiguredContentId] = @ConfiguredContentId
ORDER BY g.[Stoptime] DESC
SELECT WinNumb, COUNT (WinNumb) AS "Count"
FROM @WunNumbers wn
GROUP BY wn.[WinNumb]
END
GO
Эта хранимая процедура возвращает значения из первого оператора select, но мне хотелось бы получить значения из второго оператора select, который будет возвращен. Таблица @WunNumbers - временная таблица.
Любые идеи???
Ответы
Ответ 1
Какую версию SQL Server вы используете? В SQL Server 2008 вы можете использовать Параметры таблицы и типы таблиц.
Альтернативный подход - вернуть переменную таблицы из пользовательской функции, но я не являюсь большим поклонником этого метода.
Вы можете найти пример здесь
Ответ 2
Взгляните на этот код,
CREATE PROCEDURE Test
AS
DECLARE @tab table (no int, name varchar(30))
insert @tab select eno,ename from emp
select * from @tab
RETURN
Ответ 3
В вызывающем абоненте может быть создана временная таблица, а затем заполняется из вызываемого SP.
create table #GetValuesOutputTable(
...
);
exec GetValues; -- populates #GetValuesOutputTable
select * from #GetValuesOutputTable;
Некоторые преимущества этого подхода над "insert exec" заключаются в том, что он может быть вложен и что он может использоваться как вход или выход.
Некоторые недостатки в том, что "аргумент" не является общедоступным, создание таблицы существует внутри каждого вызывающего абонента и что имя таблицы может сталкиваться с другими временными объектами. Это помогает, когда имя таблицы temp близко соответствует имени SP и соответствует некоторому соглашению.
Принимая это немного дальше, для только выходных таблиц temp, метод insert-exec и подход temp table могут поддерживаться одновременно вызываемым SP. Это не слишком помогает для связывания SP, потому что таблица все еще должна быть определена в вызывающем, но может помочь упростить тестирование из строки cmd или при вызове извне.
-- The "called" SP
declare
@returnAsSelect bit = 0;
if object_id('tempdb..#GetValuesOutputTable') is null
begin
set @returnAsSelect = 1;
create table #GetValuesOutputTable(
...
);
end
-- populate the table
if @returnAsSelect = 1
select * from #GetValuesOutputTable;
Ответ 4
Возвращаемым типом процедуры является int.
Вы также можете возвращать наборы результатов (как это делает ваш код) (хорошо, вы также можете отправлять сообщения, которые являются строками)
Это единственные "доходы", которые вы можете сделать. Пока вы можете добавить параметры, связанные с таблицей, в процедуру (см. BOL), они вводятся только.
Edit:
(Или, как упоминалось в другом плакате, вы также можете использовать функцию с табличной оценкой, а не процедуру)
Ответ 5
ДА ВЫ МОЖЕТЕ.
В вашей хранимой процедуре вы заполняете таблицу @tbRetour
.
В самом конце хранимой процедуры вы пишете:
SELECT * FROM @tbRetour
Чтобы выполнить хранимую процедуру, вы пишете:
USE [...]
GO
DECLARE @return_value int
EXEC @return_value = [dbo].[getEnregistrementWithDetails]
@id_enregistrement_entete = '(guid)'
GO
Ответ 6
Сначала создайте реальную постоянную таблицу в качестве шаблона, который имеет необходимый макет для возвращенной временной таблицы, используя соглашение об именах, которое идентифицирует его как шаблон и символически связывает его с SP, например tmp_SPName_Output. Эта таблица никогда не будет содержать никаких данных.
В SP используйте INSERT для загрузки данных в временную таблицу, следуя одному и тому же соглашению об именах, например. #SPName_Output, который предположительно существует. Вы можете проверить его существование и вернуть ошибку, если это не так.
Перед вызовом sp используйте этот простой выбор для создания таблицы temp:
SELECT TOP(0) * INTO #SPName_Output FROM tmp_SPName_Output;
EXEC SPName;
-- Now process records in #SPName_Output;
Это имеет следующие преимущества:
- Таблица temp является локальной для текущего сеанса, в отличие от ##, поэтому не будет сталкиваться с одновременными вызовами SP из
различные сеансы. Он также автоматически отбрасывается, когда выходит за рамки.
- Таблица шаблонов поддерживается рядом с SP, поэтому, если изменения
(например, добавлены новые столбцы), а затем уже существующие
вызывающие SP не сломаются. Вызов вызывающего абонента не требуется.
- Вы можете определить любое количество выходных таблиц с разными именами для
один SP и заполнить их все. Вы также можете определить альтернативные выходы
с различным наименованием, и SP проверяет наличие временного
таблицы, которые необходимо заполнить.
- Аналогично, если сделаны крупные изменения, но вы хотите отложить назад
совместимости, вы можете иметь новую таблицу шаблонов и именовать для более поздней
но по-прежнему поддерживают более раннюю версию, проверяя, какой темп
таблица, созданная вызывающим.