Problema Select count(*)

28/08/2006 - 19:23 por Salsita | Informe spam
Hola a todos/as.
A ver si podeis echarme una mano con esto.
Supongamos el siguiente SP muy simple:

Create Procedure dbo.Clientes
(@edad int = 0)
as
Select nombre, ciudad From TbClientes
Where ((@edad = 0) or (edad = @edad))
return

Como sabreis esto permite devolver todos los registros de la tabla clientes
si no se le pasa ningún valor al parametro edad y en caso contrario, me
devolverá todos los clientes que cumplan ese criterio.
Hasta ahí todo bien, el problema viene si inserto un parametro de salida que
me devuelva el número de registros que cumplan esa condición. La cosa
quedaría así:

Alter Procedure dbo.Clientes
(@edad int = 0,
@cuenta int = 0 OUTPUT)
as
Select nombre, ciudad From TbClientes
Where ((@edad = 0) or (edad = @edad))

Select @cuenta = count(*) From TbClientes
Where ((@edad = 0) or (edad = @edad))

return @cuenta

Pues bien, el problema está en que de esta segunda forma el parametro de
salida @cuenta solamente me devuelve el resultado correcto si le doy un
valor al parámetro @edad. Si no lo hago debería devolverme el total de
registros, sin embargo me devuelve 0.

Alguna idea??
Gracias de antemano y un saludo.

Preguntas similare

Leer las respuestas

#1 Alejandro Mesa
28/08/2006 - 20:05 | Informe spam
Salsita,

Estas devolviendo el parametro de salida usando RETURN y esa no es la forma
correcta. No tienes porque contar la cantidad de filas que machan la
condicion, puedes usar @@ROWCOUNT para capturar ese valor.

Alter Procedure dbo.Clientes
(@edad int = 0,
@cuenta int OUTPUT)
as
set nocount on

Select nombre, ciudad From TbClientes
Where ((@edad = 0) or (edad = @edad))

select @cuenta = @@rowcount

return 0
go

declare @i int

exec dbo.Clientes @edad = 15, @i output

select @i
go

Si la columna [edad] no acepta valor NULL, entonces la expresion que usas en
la clausula "where" no es la mas optima, limitando a SQL Server a usar los
indices de forma optima.


AMB

"Salsita" wrote:

Hola a todos/as.
A ver si podeis echarme una mano con esto.
Supongamos el siguiente SP muy simple:

Create Procedure dbo.Clientes
(@edad int = 0)
as
Select nombre, ciudad From TbClientes
Where ((@edad = 0) or (edad = @edad))
return

Como sabreis esto permite devolver todos los registros de la tabla clientes
si no se le pasa ningún valor al parametro edad y en caso contrario, me
devolverá todos los clientes que cumplan ese criterio.
Hasta ahí todo bien, el problema viene si inserto un parametro de salida que
me devuelva el número de registros que cumplan esa condición. La cosa
quedaría así:

Alter Procedure dbo.Clientes
(@edad int = 0,
@cuenta int = 0 OUTPUT)
as
Select nombre, ciudad From TbClientes
Where ((@edad = 0) or (edad = @edad))

Select @cuenta = count(*) From TbClientes
Where ((@edad = 0) or (edad = @edad))

return @cuenta

Pues bien, el problema está en que de esta segunda forma el parametro de
salida @cuenta solamente me devuelve el resultado correcto si le doy un
valor al parámetro @edad. Si no lo hago debería devolverme el total de
registros, sin embargo me devuelve 0.

Alguna idea??
Gracias de antemano y un saludo.



Respuesta Responder a este mensaje
#2 Pedro Echavarria
29/08/2006 - 03:57 | Informe spam
A parte de lo que te dice Alejandro, es mejor que pongas tus dos condiciones
del Where con un IF. Imagino que es mas eficiente:

if @edat=0
Select nombre, ciudad From TbClientes
else
Select nombre, ciudad From TbClientes
Where (edad = @edad)



"Salsita" wrote in message
news:
Hola a todos/as.
A ver si podeis echarme una mano con esto.
Supongamos el siguiente SP muy simple:

Create Procedure dbo.Clientes
(@edad int = 0)
as
Select nombre, ciudad From TbClientes
Where ((@edad = 0) or (edad = @edad))
return

Como sabreis esto permite devolver todos los registros de la tabla
clientes si no se le pasa ningún valor al parametro edad y en caso
contrario, me devolverá todos los clientes que cumplan ese criterio.
Hasta ahí todo bien, el problema viene si inserto un parametro de salida
que me devuelva el número de registros que cumplan esa condición. La cosa
quedaría así:

Alter Procedure dbo.Clientes
(@edad int = 0,
@cuenta int = 0 OUTPUT)
as
Select nombre, ciudad From TbClientes
Where ((@edad = 0) or (edad = @edad))

Select @cuenta = count(*) From TbClientes
Where ((@edad = 0) or (edad = @edad))

return @cuenta

Pues bien, el problema está en que de esta segunda forma el parametro de
salida @cuenta solamente me devuelve el resultado correcto si le doy un
valor al parámetro @edad. Si no lo hago debería devolverme el total de
registros, sin embargo me devuelve 0.

Alguna idea??
Gracias de antemano y un saludo.

email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida