2009-06-15 24 views
16

Estoy creando un procedimiento almacenado en la base de datos Sql Server 2008. Quiero devolver el número de filas afectadas. ¿Cuál es la mejor opción? CONFIGURAR NOCOUNT OFF o RETURN @@ ROWCOUNT?SET NOCOUNT OFF o RETURN @@ ROWCOUNT?

ALTER PROCEDURE [dbo].[MembersActivateAccount] 
    @MemberId uniqueidentifier 
AS 
BEGIN 
    -- Should I use this? 
    SET NOCOUNT OFF; 

    UPDATE [dbo].Members SET accountActive = 1 WHERE id = @MemberId; 
    --Or should I SET NOCOUNT ON and use the following line instead? 
    --return @@ROWCOUNT; 
END 

Sé que ambos funcionan, pero ¿cuál es una mejor opción y por qué?


Después de algún tratando Estoy llegando a la conclusión de que SET NOCOUNT está desactivada por defecto dentro de los procedimientos almacenados. ¿Es posible cambiar este comportamiento dentro de mi base de datos?

Respuesta

23

Use @@ RowCount. Es explícito y transparente, está completamente controlado por su código en lugar de un comportamiento incorporado.

La opción NOCOUNT se puede establecer manualmente de manera predeterminada en ON (Optons> Query Execution> SQL Server> Advanced). Si lo configura de esta manera, pero luego declara SET NOCOUNT OFF en su procedimiento almacenado, esa configuración local tiene prioridad.

4

Sé que tener SET NOCOUNT ON haría que un DataAdapter piense que hubo un conflicto de simultaneidad.

Puede read about it on MSDN. Si el código va a ser utilizado por DataAdapters, obviamente no use SET NOCOUNT ON.

Parece SqlCommand also has this behaviour, que supongo que es la razón por la que DataAdapter tiene un problema (ya que bajo el capó usará un objeto Command).

+0

No veo nada mencionado sobre SET NOCOUNT dentro de la documentación de SqlCommand. ¿Estás seguro de que existe el mismo problema que con DataAdapters? – niaher

+1

Google IT se encuentra gran cantidad de evidencia que lo hace: http://www.google.co.uk/search?client=firefox-a&rls=org.mozilla%3Aen-GB%3Aofficial&channel=s&hl=en&q=ExecuteNonQuery+ NoCount & meta = & btnG = Búsqueda de Google +. No puedo estar seguro de que sea el mismo problema que DataAdapters sin probarlo, pero no veo por qué habría otra razón. – RichardOD

5

No utilice RETORNO para los valores. Por convención, RETORNO de los procedimientos almacenados es para códigos de error, 0 significa que no hay error y que no es 0, lo que significa algún tipo de problema. Si necesita recuperar datos, la forma adecuada de hacerlo es con un parámetro OUTPUT. Es un poco contra-intuitivo basado en el uso del retorno de otros idiomas.

+0

Hay una razón para esto: la última vez que revisé, RETORNO está limitado a los valores shortint, es decir, el valor máximo retornable es 65535. – enorl76

2

Razones para utilizar SET NOCOUNT ON/OFF:

para controlar el desbordamiento de pila al insertar filas en cualquier mesa. Pasando los mensajes T-Sql mientras se ejecutan las consultas o consultas anidadas. Para mostrar o ver las últimas consultas ejecutadas. Para obtener información sobre la última escalada de registros.

0

por eso que usamos SET NOCOUNT ON/OFF ---

Respuesta: podemos entender esta siguiendo los pasos

Paso 1: Ejecutar consulta "SELECT TOP 10 * del nombre de la tabla" .

paso 2: abrir ventana de mensaje, muestra el mensaje "10 filas afectadas". crea gastos generales adicionales y extiende nuestro tiempo de ejecución.

paso 3: para superar estos gastos adicionales utilizamos SET NOCOUNT ON. Si está activado, entonces nunca contará el número de retornos de fila, sino que siembra un comando de mensaje completado con éxito.

paso 4: de forma predeterminada, NOCOUNT está activado, entonces cuenta el número de filas devueltas, por eso sugiero que no se active durante la creación de nuevos procedimientos para obtener un mejor rendimiento del servidor de la base de datos.