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

Как вернуть временную таблицу из хранимой процедуры

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 - временная таблица.

Любые идеи???

4b9b3361

Ответ 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 проверяет наличие временного таблицы, которые необходимо заполнить.
  • Аналогично, если сделаны крупные изменения, но вы хотите отложить назад совместимости, вы можете иметь новую таблицу шаблонов и именовать для более поздней но по-прежнему поддерживают более раннюю версию, проверяя, какой темп таблица, созданная вызывающим.