Как установить результат хранимой процедуры exec для переменной? - PullRequest
0 голосов
/ 22 октября 2009

Мне нужно выполнить хранимую процедуру и сохранить ее скалярный результат в локальной переменной внутри хранимой процедуры.

Как реализовать?

Е.Г.

CREATE PROCEDURE [dbo].GetNthNo AS 
 DECLARE @a INT
 DECLARE @d INT
 DECLARE @n INT
DECLARE @S INT
SET @S=EXEC spGetNthNo @a,@d,@n

SELECT @S 

Пожалуйста, помогите.

Ответы [ 2 ]

2 голосов
/ 23 октября 2009

Вместо:

SET @S=EXEC spGetNthNo @a,@d,@n

Вам нужно:

EXEC @S = spGetNthNo @a,@d,@n

А затем в рамках процедуры вам нужно что-то вроде:

RETURN 100

или

RETURN @x

для значения, которое вы хотите для @S после выполнения процедуры.

Вы также можете использовать выходные параметры. Объединенный пример:

IF OBJECT_ID('tempdb..#example') IS NOT NULL DROP PROCEDURE #example
GO

CREATE PROCEDURE #example
  @output_param INT OUTPUT
AS BEGIN
   SET @output_param = 100
   RETURN 200
END
GO

DECLARE @return INT, @param INT
EXEC @return = #example @output_param = @param OUTPUT
SELECT @return as [return value], @param as [output parameter]
1 голос
/ 22 октября 2009

Попробуйте что-нибудь подобное

CREATE PROCEDURE Test
  @RetVal INT OUT
AS
BEGIN
  SET @RetVal = 99
END

DECLARE @X INT
EXEC Test @X OUT
PRINT @X

Редактировать : [комментарий после публикации рассматриваемого фрагмента T-SQL]
Кажется, вам нужна оболочка вокруг хранимой процедуры spGetNthNo, возможно, потому что эта существующая процедура не возвращает желаемый результат. Альтернативой обёртке может быть просто модифицировать [очень немного] сам spGetNthNo, поэтому он, во-первых, работает как нужно (при условии, что метод в настоящее время не используется с существующим API).

Независимо от того, будут ли изменения в исходном SP или в обертке, есть два различных способа получения данных из SP:

  • С выходными переменными (как показано выше)
  • Если SP возвращает «набор записей», то есть таблицу, состоящую из строк (записей) и столбцов (полей). (Это делается с помощью инструкции SELECT в конце SP, как показано во фрагменте вопроса)

При использовании метода выходных переменных данные легко помещаются в переменные ко времени возврата SP. При использовании набора записей логике вызова необходимо «потреблять» возвращаемые данные аналогично тому, как это делается в операторе SELECT.

Помимо способа использования возвращаемых данных, есть несколько различий между этими подходами .
Наиболее очевидный из них заключается в том, что подход «набор записей» позволяет возвращать больше значений : нужно было бы явно объявить, скажем, 30 переменных (с некоторым соглашением об именах, направленным на помощь с двумерным характером таблицы) эмулировать возврат SP, который "ВЫБЕРИТЕ ТОП 10 a, b, c ИЗ myTable". Также SP должен был бы явно установить каждую из этих выходных переменных.
Другое связанное, но более тонкое отличие состоит в том, что подход набора записей позволяет возвращать количество строк и столбцов, которое не определено во время вызова . Число и типы переменных не нужно указывать заранее, скорее они поставляются с метаданными, окружающими набор записей.

Вкратце : подход с использованием выходных переменных больше подходит для возврата фиксированного набора из нескольких переменных, таких как код состояния, максимальное или минимальное значение (или другие совокупные значения и вычисления), а также, несколько полей из одной ожидаемой записи. Подход Recordset используется, когда целью хранимой процедуры является эффективное предоставление табличного результата или когда он возвращает очень много значений, таких как длинный [и развивающийся] список совокупных значений и т. Д.

...