#.net #sql-server #sql-server-2008
#.net #sql-сервер #sql-server-2008
Вопрос:
Рассматривая следующий пример
Procedure1
..........
IF(@errorcode<>0) ROLLBACK TRANSACTION
ELSE COMMIT TRANSACTION
SELECT @errorcode
Procedure2
..........
WHILE [condition] BEGIN
EXEC @proc1result = Procedure1 [parameters]
IF(@proc1result=0) SET @totalresult=@totalresult 1
END
SELECT @totalresult
Проблема в том, что @totalresult увеличивается правильно, но значение, возвращаемое Procedure2, равно 0.
Как сделать это правильно?
Я использую sql server 2008 и Entity Framework 4. Procedure1 работает хорошо.
Ответ №1:
(1) Для первой хранимой процедуры вы должны использовать RETURN @errorcode
, а не SELECT @errorcode
. Это также моя рекомендация.
ИЛИ (НЕ И)
(2) Для второй хранимой процедуры вы должны использовать INSERT ... EXEC Procedure1
следующее:
WHILE [condition]
BEGIN
DECLARE @Results TABLE (RetValue INT PRIMARY KEY);
INSERT @Results
EXEC Procedure1 [parameters];
--IF 0=ALL(SELECT a.RetValue FROM @Results a)
IF NOT EXISTS(SELECT * FROM @Results a WHERE a.RetValue <> 0)
SET @totalresult=@totalresult 1;
END
SELECT @totalresult
Комментарии:
1. Если транзакция из procedure1 откатывается, я получаю «Невозможно использовать оператор ОТКАТА в инструкции INSERT-EXEC». исключение, если все идет хорошо, и Procedure1 фиксируется каждый раз, когда я получаю правильный результат.
2. @gigi: Если вы посмотрите на мой ответ, вы увидите мою рекомендацию. Для хранимой процедуры
RETURN @something
должен использоваться для возврата кода ошибки, в то времяSELECT something ...
как должен использоваться для возврата набора записей.
Ответ №2:
«но значение, возвращаемое Procedure2, равно 0»
Вы делаете SELECT @totalresult
. Должно ли это быть return @totalresult
?
Ответ Upendra…
CREATE PROC dbo.TestReturn (@InValue int)
AS
Return @Invalue 1
GO
declare @value int
exec @value = TestReturn 100
select @value
Комментарии:
1. Как оператор return может вернуться в процедуру?. Он должен работать в функции.
2. Поскольку я использую Entity Framework, кажется, что мне нужно использовать select вместо return для возврата скалярного значения