Recuento de devolución en procedimiento almacenado

Escribí un procedimiento almacenado para devolver un conteo. Pero obtuve un valor nulo. ¿Alguien puede decirme dónde está el problema en mi procedimiento almacenado?

set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[ValidateUser] @UserName varchar(50), @Password varchar(50), @Num_of_User int output AS BEGIN SET NOCOUNT ON; SELECT @Num_of_user =COUNT(*) FROM login WHERE username = @UserName AND pw = @Password RETURN END 

está configurando el valor en la variable @num_of_user. agregar select @num_of_user después de la consulta

 set ANSI_NULLS ON set QUOTED_IDENTIFIER ON go ALTER PROCEDURE [dbo].[ValidateUser] @UserName varchar(50), @Password varchar(50), @Num_of_User int output AS BEGIN SET NOCOUNT ON; SELECT @Num_of_user =COUNT(*) FROM login WHERE username=@UserName AND pw=@Password SELECT @Num_of_user return END 

En realidad, no devuelve el conteo, es un parámetro de salida.

Cambie su sproc para devolver @num_of_user o verifique el parámetro de salida en lugar del valor de retorno.

Los procedimientos y funciones en SQL Server me resultan un tanto confusos, ya que un procedimiento también puede devolver un valor. Sin embargo, puede lograr lo que desea eliminando el parámetro de salida @Num_of_user y reemplazando

 SELECT @Num_of_user =COUNT(*) FROM login WHERE username = @UserName AND pw = @Password 

con

 SELECT COUNT(*) FROM login WHERE username = @UserName AND pw = @Password 

La última instrucción de selección siempre se devuelve desde un PROCEDIMIENTO en el server SQL.

No necesitas el isnull. Seleccionar conteo (*) siempre devuelve un valor no nulo. Incluso puedes emitir un

 select count(*) from anytable where 1=2 

y obtendrás un 0, no un nulo. Creo que tu problema llega cuando ejecutas la sp. Es posible que le falte la palabra key 'salida' junto al @Num_of_User. Tu llamada debería ser algo así como

 declare @outNum int exec ValidateUser 'some', 'wrong', @outNum output print @outNum 

Observe la palabra key 'output' a la derecha del parámetro

Solo otro método, pero fuera del Procedimiento almacenado, un simple SELECT @@ROWCOUNT puede funcionar para get el número de filas.

Tenía el mismo problema cuando devolvió nulo; intenta usar paréntesis:

 SELECT @Num_of_user = ( COUNT(*) FROM login WHERE username = @UserName AND pw = @Password )