SQL SERVER 2008, проблема с вложенными процедурами

#.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 для возврата скалярного значения