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





Хранимая процедура возвращает набор записей, как и любая другая, так что вы действительно можете сделать это:
ВСТАВИТЬ В MyTable ( MyValue )
EXEC dbo.MyStoredProcedure
EXEC заменяет инструкцию SELECT. Чтобы получить значение, просто выберите из таблицы, в которую вы вставили. Обычно это временная таблица.
Другой вариант - преобразовать хранимую процедуру, возвращающую набор записей, в функцию, возвращающую таблицу.
Подход Ant, вероятно, лучше всего, если вы хотите минимизировать изменения в вашей системе.
Обычно вы использовали бы временную таблицу для этого подхода, поскольку вы не можете использовать оператор exec для вставки в переменную таблицы.
Вот вариант, который хорошо подойдет, если вам нужно использовать его для НЕСКОЛЬКИХ наборов записей.
CREATE TABLE #outsidetable (...)
exec spInsideProcedure
SELECT * FROM #outsidetable
внутри spInsideProcedure
INSERT INTO #outsidetable SELECT <blah blah blah>
Я попробовал подход Ant, и он сработал:
Declare @Success tinyint Declare @Response Table (Success int) Insert into @Response(Success) Exec Fix_RollbackReturn 12345, 15 Select @Success=Success from @Response
Как видите, я использовал переменную таблицы, а не временную таблицу, потому что она немного более эффективна, чем временная таблица.
Спасибо за вашу помощь, ребята.
Обновлено: Похоже, что Дэйв был прав. То есть мой подход «Exec-into-Table-variable» работал на моей машине разработки SQL2005, но при перемещении на машину Live (SQL2000) он возражал, поэтому мне пришлось перейти на подход временной таблицы.
Это немного раздражает, тем более что через пару недель мы полностью перейдем на SQL2005 (!).
Вы также можете вставить в временную таблицу (не в таблицу в памяти). Другими словами, вы можете вставить в #MyTempTable, но не в @MyOtherTempTable.