MS SQL: запретить возвращаемое значение хранимой процедуры, вызываемой в хранимой процедуре

Я думаю, что у меня та же проблема, что и 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 будет выбирать записи или просто делать что-то и молча выйти.