Вызов хранимой процедуры из хранимой процедуры и возврат набора записей

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

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

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

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

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

Спасибо

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
1 756
4
Перейти к ответу Данный вопрос помечен как решенный

Ответы 4

Ответ принят как подходящий

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

ВСТАВИТЬ В MyTable ( MyValue )

EXEC dbo.MyStoredProcedure

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

Вы также можете вставить в временную таблицу (не в таблицу в памяти). Другими словами, вы можете вставить в #MyTempTable, но не в @MyOtherTempTable.

Micky McQuade 23.10.2008 21:03

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

Подход 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 (!).

Другие вопросы по теме