Вызов сохраненного процесса из хранимого процесса и возврат набора записей - PullRequest
2 голосов
/ 23 октября 2008

У меня есть хранимая процедура, которая откатывает серию операций. Я хочу назвать это из другого SP.

Проблема в том, что внутренний SP возвращает набор записей с одним значением, которое указывает степень успеха.

Этот подход хорошо работал и имеет некоторые преимущества в нашем контексте, но в ретроспективе я бы сделал это обычным способом с помощью значения Return или параметра Output.

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

Как (если вообще) я могу вызвать этот SP и определить значение возвращенного набора записей синглтона?

Спасибо

Ответы [ 4 ]

7 голосов
/ 23 октября 2008

Хранимая процедура возвращает набор записей, как и любой другой, поэтому вы можете сделать это:

INSERT INTO MyTable ( MyValue )

EXEC dbo.MyStoredProcedure

EXEC занимает место оператора SELECT. Чтобы получить значение, просто ВЫБЕРИТЕ из таблицы, в которую вы вставили. Обычно это временная таблица.

1 голос
/ 23 октября 2008

Вот вариант, который будет хорошо работать, если вам нужно использовать его для НЕСКОЛЬКИХ наборов записей.

CREATE TABLE #outsidetable (...)
exec spInsideProcedure
SELECT * FROM #outsidetable

внутри spInsideProcedure

INSERT INTO #outsidetable SELECT <blah blah blah>
1 голос
/ 23 октября 2008

Другой вариант - преобразовать хранимую процедуру, которая возвращает набор записей, в функцию, которая возвращает таблицу.

Возможно, Ant лучше всего подойдет, если вы хотите минимизировать изменения в вашей системе.

Обычно для этого подхода вы используете временную таблицу, поскольку вы не можете использовать инструкцию exec для вставки в переменную таблицы.

0 голосов
/ 24 октября 2008

Я попробовал подход Ант, и это сработало:

Declare @Success tinyint
Declare @Response Table (Success int)
Insert into @Response(Success)
Exec Fix_RollbackReturn 12345, 15
Select @Success=Success from @Response

Как видите, я использовал переменную таблицы, а не временную таблицу, потому что она немного более эффективна, чем временная таблица.

Спасибо за вашу помощь, ребята.

РЕДАКТИРОВАТЬ: Кажется, что Дейв был прав в конце концов. То есть мой подход с использованием переменной Exec-to-Table работал на моей машине для разработки SQL2005, но при переносе на машину Live (SQL2000) он возражал, поэтому мне пришлось перейти на подход с временной таблицей.

Это немного раздражает, тем более что через пару недель мы обновляемся до SQL2005 по всем направлениям (!).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...