Каков наилучший способ присвоить возвращаемое значение хранимого процесса для переменной в SQL? - PullRequest
6 голосов
/ 20 февраля 2009

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

Вопрос в том, какой самый эффективный способ получить возвращаемое значение хранимой процедуры и сохранить его в переменной вызывающего процесса?

В настоящее время у меня есть следующее, и мне интересно, если это очень неэффективно?

DECLARE @tmpNewValue TABLE (newvalue int)
INSERT INTO @tmpNewValue EXEC GetMyValue

DECLARE @localVariable int
SET @localVariable = (SELECT TOP 1 newvalue FROM @tmpNewValue )

Нет ли более прямого способа сделать это? Разве это не дорогой (с точки зрения производительности) способ?

Мой сохраненный процесс не имеет выходного параметра, он просто возвращает значение. Будет ли использование выходного параметра быстрее?

Для чего я стою, я использую MS SQL Server 2005

Ответы [ 4 ]

13 голосов
/ 20 февраля 2009

Если вы получаете единственную возвращаемую переменную, тогда да, это неэффективно, вы можете сделать:

declare @localVariable int
exec @localVariable =GetMyValue
select @localVariable 
3 голосов
/ 20 февраля 2009

См. Как обмениваться данными между хранимыми процедурами
По некоторым причинам exec @localVariable = GetMyValue не работает для меня (MS SQL 2005), он всегда возвращает значение 0 ( У них та же проблема ).

Мое мнение таково:
если вы можете изменить хранимую процедуру, добавьте выходной параметр.
иначе, если вы можете удалить процедуру, перепишите ее как функцию.
иначе используйте переменную таблицы, как и вы.

1 голос
/ 20 февраля 2009

Этот процесс возвращает набор строк из 1 строки и 1 столбца или вообще без набора строк, и вы просто хотите захватить код возврата?

Если вам нужен только код возврата, используйте метод Джоша, иначе используйте параметр OUTPUT sicne, это будет намного быстрее, чем то, что вы делаете сейчас

Чтобы объяснить, что я имею в виду, запустите этот код

use tempdb
go

create proc GetMyValue
as
select 1
go


create table #temp (id int)
declare @localVariable int

insert #temp
exec @localVariable =GetMyValue
select @localVariable,* from #temp
0 голосов
/ 19 июня 2009

Попробуйте это:

create proc AvilableSeats
as
declare @v1 int,@v2 int
exec @v1= determinPath_Capacity 1,'Sat-Tue',32
exec @v2=Student_fGroup '6/12/2009'
select @v1-@v2
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...