Я думаю, что у меня та же проблема, что и kcrumley в вопросе "Проблема вызова хранимой процедуры из другой хранимой процедуры через классический ASP". Однако его вопрос действительно не включает решение, поэтому я дам ему еще один выстрел, добавив свои собственные наблюдения:
У меня есть две хранимые процедуры:
CREATE PROCEDURE return_1 AS BEGIN
SET NOCOUNT ON;
SELECT 1
END
CREATE PROCEDURE call_return_1_and_return_2 AS BEGIN
SET NOCOUNT ON;
EXEC return_1
SELECT 2
END
Обратите внимание, что обе процедуры содержат "SET NOCOUNT ON". Когда я выполняю "call_return_1_and_return_2", я все еще получаю два набора записей. Сначала значение 1, затем значение 2.
Отбрасывает ASP (классический VBScript ASP) с дорожек.
Любые подсказки о том, как я могу подавить первый набор результатов? Почему он существует даже с помощью NOCOUNT?
Пропуск первого набора записей в ASP не является вариантом. Мне нужно решение "только для базы данных".
Ответ 1
Это не NOCOUNT, который вызывает это, ваши хранимые процедуры имеют выбор, каждый из которых входит в свой собственный результирующий набор. Этого можно избежать, изменив первую хранимую процедуру, чтобы использовать выходные параметры, чтобы передать номер 1, а не делать выбор. Вторая хранимая процедура может затем проверить выходной параметр, чтобы получить необходимые ему данные.
Попробуйте что-то вроде этого
CREATE PROCEDURE Proc1
(
@RetVal INT OUTPUT
)
AS
SET NOCOUNT ON
SET @RetVal = 1
CREATE PROCEDURE Proc2
AS
SET NOCOUNT ON
DECLARE @RetVal int
EXEC [dbo].[Proc1]
@RetVal = @RetVal OUTPUT
SELECT @RetVal as N'@RetVal'
Ответ 2
Как указывает Мэтт в своем комментарии, ни одно решение не "проглотит" первый набор результатов.
Я не знаю, зачем вам это нужно, но вы можете "усвоить" результат первого exec, используя переменную таблицы. Он должен соответствовать точной величине и типу столбцов набора результатов. Например:
CREATE PROCEDURE return_1 AS
SET NOCOUNT ON;
SELECT 1
GO
CREATE PROCEDURE call_return_1_and_return_2 AS
SET NOCOUNT ON;
DECLARE @Result TABLE (res int)
insert into @Result EXEC return_1
SELECT 2
GO
Ответ 3
Это не возвращаемые переменные, а выходные записи. Я предполагаю, что как только SQL-сервер сбросит выходные данные на клиент, вы ввернуты и не сможете вернуть его.
Я бы решил это, добавив параметр в SP return_1, который будет управлять, если return_1 будет выбирать записи или просто делать что-то и молча выйти.