2008-10-17 20 views
21

Dentro de un procedimiento almacenado, se llama a otro procedimiento almacenado dentro de un cursor. Para cada llamada, la ventana de resultados de SQL Management Studio muestra un resultado. El cursor gira más de 100 veces y en ese punto la ventana de resultados se da por vencida con un error. ¿Hay alguna manera de evitar que el procedimiento almacenado dentro del cursor arroje resultados?¿Cómo desactivo los resultados de la consulta al ejecutar un procedimiento almacenado desde un procedimiento almacenado?

WHILE @@FETCH_STATUS = 0 
    BEGIN 
    EXEC @RC = dbo.NoisyProc 
    SELECT @RValue2 = 1 WHERE @@ROWCOUNT = 0 
    FETCH NEXT FROM RCursor INTO @RValue1, @RValue2 
    END 

¡Gracias!

+0

¿Estás seguro de que necesitas usar un cursor? Se supone que esos no son la primera opción en SQL Server en estos días. De hecho, muchos expertos los aborrecen. – DOK

+0

Por favor, publique aquí el error que está recibiendo. –

Respuesta

14

se podría insertar los resultados en una tabla temporal, a continuación, colocar la tabla temporal

create table #tmp (columns) 

while 
    ... 
    insert into #tmp exec @RC=dbo.NoisyProc 
    ... 
end 
drop table #tmp 

de lo contrario, se puede modificar el proc ser llamado a aceptar una bandera diciendo no a la salida de una configuración resultado?

+0

Estaba reutilizando un proceso utilizado por la aplicación web para un procedimiento de importación reutilizable, por lo que no pude cambiar el comportamiento del proceso. Esto fue lo único. –

0

Lugar:

SET ROWCOUNT OFF 
/* the internal SP */ 
SET ROWCOUNT ON 

envoltura que todo el SP interno, o incluso podría hacerlo alrededor de la instrucción SELECT de la consulta de origen, que evitará que aparezcan los resultados.

+0

Lo intenté pero recibí un error. También intenté envolverlo alrededor de SET ROWCOUNT 1 y SET ROWCOUNT 0 sin éxito. –

+0

Creo que esto funciona para SQL Server 2005 en adelante. Si está utilizando SQL 2000, consulte la respuesta de Estanislao. – RLH

+2

La sintaxis para SET ROWCOUNT es SET ROWCOUNT {number | @number_var}. No toma ON/OFF como argumento. – Tony

29

Puede descartar los conjuntos de resultados en SQL Server Gestión de Studio 2005 siguiendo los pasos a continuación:

• Haga clic derecho en la ventana de consulta
• elegir la opción "Opciones de consulta"
• Haga clic en los "Resultados" "nodo" en la vista de árbol de panel izquierdo
• Comprobar "Descartar los resultados después de la ejecución" en el centro/derecha del formulario

puede probarlo en

DECLARE @i int 
SET @i = 1 
WHILE (@i <= 100) 
    BEGIN 
    SELECT @i as Iteration 
    SET @i = @i + 1 
    END 

+2

Esta debería ser la respuesta aceptada: es la opción de SSMS para hacer exactamente lo que solicitó el cartel original –

+1

Gracias Gracias Gracias! Esto es brillante. –

3

cursores mal. No reutilice el código de proceso almacenado si eso significa que tiene que hacer una función basada en conjunto con un cursor. Mejor para el rendimiento escribir el código de una manera establecida.

Creo que me preocupa que esté más preocupado con la supresión de los mensajes que el hecho de que tenga un error en el cursor.

+1

Tienes razón, aunque estoy restringido aquí. No puedo cambiar el procedimiento almacenado por razones de soporte, ya que pertenece a un tercero. –

1

Probablemente el error proviene de demasiados conjuntos de registros devueltos, en lugar de un error lógico en su SP o el cursor mismo. Mira este ejemplo:

DECLARE @I INT 
SET @I=0 
WHILE @I<200 BEGIN 
    SELECT * FROM INFORMATION_SCHEMA.TABLES 
    SET @I = @I + 1 
END 

Se ejecutará un número de veces (poco más de 100) y luego fallar con:

La consulta ha superado el número máximo de conjuntos de resultados que se pueden mostrar en el cuadrícula de resultados Solo los primeros 100 conjuntos de resultados se muestran en la cuadrícula.

El SSMS tiene un límite en la cantidad de conjuntos de registros que puede mostrarle. Una manera rápida de eludir esa limitación es presionar Ctrl + T (o Consulta de menú-> Resultados a-> Resultados a texto) para forzar que la salida esté en texto plano, en lugar de conjuntos de registros en forma de tabla. Llegará a otro límite con el tiempo (la ventana de resultados no puede manejar una cantidad infinita de salida de texto) pero será mucho mayor.

En el ejemplo anterior no se obtiene el error después de cambiar los resultados para que estén en forma de texto.

9

Sé que esta pregunta es antigua, pero puede configurar el SET NOCOUNT ON para evitar que el SP emita un mensaje por cada fila.

+1

Gracias, gracias, gracias! Esta es la respuesta exacta para SQL 2000. Supongo que la respuesta de Adam funciona para SQL 2005+. – RLH

+2

NOCOUNT es bueno, ya que mantiene el número de resultados que se muestran, sin embargo, el 6eorge Jetson/Robert Koritnik excluye los conjuntos de resultados adicionales que se muestran (¿cuál pensé que era la pregunta original)? –

Cuestiones relacionadas