2009-03-03 20 views
10

Creo que tengo el mismo problema que describe kcrumley en la pregunta "Problem calling stored procedure from another stored procedure via classic ASP". Sin embargo, su pregunta no ofrece realmente una solución, así que voy a darle otra oportunidad, añadiendo mis propias observaciones:MS SQL: Suprime el valor devuelto del procedimiento almacenado llamado en el procedimiento almacenado

Tengo dos procedimientos almacenados:

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 

Tenga en cuenta que ambos procedimientos contienen "SET NOCOUNT ON ". Cuando ejecuto "call_return_1_and_return_2" sigo teniendo dos juegos de registros. Primero el valor 1, luego el valor 2.

Eso arroja ASP (clásico VBScript ASP) fuera de las pistas.

¿Alguna pista sobre cómo puedo suprimir el primer conjunto de resultados? ¿Por qué está allí incluso con NOCOUNT?

Saltarse el primer conjunto de registros en ASP no es una opción. Necesito una solución de "solo base de datos".

+0

Un par de respuestas están señalando que puede cambiar de un SELECT a una vuelta, pero esto es una gran pregunta - ¿y si el procedimiento almacenado anidado tiene que seleccionar, porque otra cosa lo llama, y no puedes cambiarlo? Me pregunto si es posible "tragar" un conjunto de resultados así. –

Respuesta

8

No es el NOCOUNT que está causando esto, sus procedimientos almacenados tienen un seleccionar cada uno por lo que cada uno viene en su propio conjunto de resultados. Esto podría evitarse cambiando su primer procedimiento almacenado para usar parámetros de salida para pasar el número 1 de vuelta en lugar de hacer una selección. El segundo procedimiento almacenado podría examinar el parámetro de salida para obtener los datos que necesita ejecutar.

intentar algo como esto

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

Los que no están de regreso variables, pero los conjuntos de registros de salida. Supongo que tan pronto como el servidor SQL envía la salida al cliente, estás jodido y no puedes recuperarlo.

Resolvería esto agregando un parámetro a SP return_1, que controlaría si return_1 selecciona registros o simplemente hace cosas y sale silenciosamente.

12

Como Matt señala en su comentario, ninguna de las dos soluciones realmente "traga" el primer resultado. No sé por qué quieres esto, pero puedes 'tragar' el resultado del primer ejecutivo usando una variable de tabla. Debe coincidir con la cantidad exacta y el tipo de columnas del conjunto de resultados. De este modo:

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 
Cuestiones relacionadas