2011-02-28 9 views
5

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?Cuenta de devolución en el 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 
+1

¿Cómo está tratando de leer ese valor? –

+0

@BenCr le dice cómo obtener el recuento como un valor de retorno, o para usar el parámetro de salida que definió como parte de su procedimiento almacenado. @atbebtg te dice cómo obtener el conteo como un conjunto de resultados. – Suncat2000

Respuesta

2

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.

+0

Mi código está verificando el parámetro de salida, pero es nulo. Ahora he modificado el sproc como {ALTER PROCEDIMIENTO [dbo]. [ValidateUser] \t varchar @UserName (50), varchar \t @Password (50), \t @Num_of_User salida int \t AS COMENZAR \t SET NOCOUNT EN; \t SELECT COUNT (*) como Num_of_user de conexión Se WHERE nombre de usuario = @ nombre de usuario y contraseña PW = @ END} y el num_of_user sigue siendo nula. No soy bueno en SProc. Por favor ayuda. – user637995

+0

Sin una copia completa del código de llamada y su base de datos, no sé cómo puedo ayudar. ¿Has probado tu SPROC desde SQL Server Management Studio? ¿Es un problema con los datos o el código de llamada? – BenCr

6

está estableciendo el valor en la variable @num_of_user. Selección de ADD @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 [email protected] AND [email protected] 

    SELECT @Num_of_user 
return 
END 
+0

Si publica código, XML o muestras de datos, ** por favor ** resalte esas líneas en el editor de texto y haga clic en el botón "muestras de código" ('{}') en la barra de herramientas del editor para formatear y sintaxis ¡destaquelo! –

1

procedimientos y funciones en el servidor SQL son un poco confuso para mí, ya que un procedimiento también puede devolver un valor. Sin embargo, se puede lograr lo que se desea, eliminando el parámetro de salida @Num_of_user y la sustitución de

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 servidor SQL.

0

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

select count(*) from anytable where 1=2 

y obtendrá un 0, no un nulo. Creo que tu problema llega cuando ejecutas la sp. Es posible que le falte la palabra clave 'salida' junto al @Num_of_User. Su llamada debe ser algo como

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

Aviso de la 'salida' de palabras clave a la derecha del parámetro

0

Sólo otro método, pero fuera del procedimiento almacenado un simple SELECT @@ROWCOUNT puede trabajar para obtener el número de filas .

0

Tuve el mismo problema cuando devolvió nulo; intente utilizar paréntesis:

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