MS SQL: подавить возвращаемое значение хранимой процедуры, вызываемой в хранимой процедуре - PullRequest
11 голосов
/ 03 марта 2009

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

Ответы [ 3 ]

13 голосов
/ 03 марта 2009

Как отмечает Мэтт в своем комментарии, ни одно из решений не «проглотило» первый набор результатов. Я не знаю, зачем вам это нужно, но вы можете «проглотить» результат первого 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
9 голосов
/ 03 марта 2009

Это не 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 голосов
/ 03 марта 2009

Это не возвращаемые переменные, а наборы выходных записей. Я предполагаю, что как только SQL-сервер сбрасывает вывод на клиент, вы облажались и не можете его вернуть.

Я бы решил эту проблему, добавив параметр в SP return_1, который бы контролировал, будет ли return_1 выбирать записи или просто делать что-то и молча выходить.

...