Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Procedimiento con WHERE opcional

Estas en el tema de Procedimiento con WHERE opcional en el foro de SQL Server en Foros del Web. Buenas. Tengo la siguiente situación. Un procedimiento que recibe un parámetro ID. Si el parámetro ID es cero (0) Sacar la consulta sin WHERE, y ...
  #1 (permalink)  
Antiguo 09/08/2007, 02:34
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Procedimiento con WHERE opcional

Buenas.
Tengo la siguiente situación. Un procedimiento que recibe un parámetro ID.
Si el parámetro ID es cero (0) Sacar la consulta sin WHERE, y si es distinto de cero, sacar la miusma consulta, pero con WHERE ID=@ID
Bien. Se me ocurre algo así:
Código:
IF @ID=0
    Consulta sin WHERE
ELSE
    Consulta con WHERE
Pero a eso le veo el problema que tengo que escribir la misma consulta idéntica dos veces y no me gusta. No puedo aprovechar el texto y luego, si hay que ponerle un WHERE, agregárselo de alguna forma, y así no repetir código?
Gracias por las opiniones?
Saludos.
__________________
..:: moNTeZIon ::..
  #2 (permalink)  
Antiguo 09/08/2007, 06:41
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
Re: Procedimiento con WHERE opcional

si en lugar de cero mandas un nulo (o no lo mandas)
Código:
Create Procedure spMiProceso @Id = null
AS

      Select 
      ........

      Where Id = isnull(@Id, Id)
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
  #3 (permalink)  
Antiguo 10/08/2007, 02:23
Avatar de moNTeZIon  
Fecha de Ingreso: enero-2005
Ubicación: Lliçà de Munt - BCN
Mensajes: 1.625
Antigüedad: 19 años, 3 meses
Puntos: 9
Re: Procedimiento con WHERE opcional

Gracias Andrés
__________________
..:: moNTeZIon ::..
  #4 (permalink)  
Antiguo 15/08/2007, 11:35
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: Procedimiento con WHERE opcional

Existe un super super super truco que me pirateé de algún código de por la red . Te permite hacer que las variables sean opcionales, si no tiene valor (null) entonces asume que no hay filtro y que verás todo:


CREATE PROCEDURE miproc(
@filtro int
)AS

SELECT cosa
FROM tabla
WHERE campo = @filtro OR @filtro IS NULL

De esa manera te evitas tener múltiples sentencias o tener que lidiar con el SQL dinámico.

No hay magia, ya que lo analicé es justo lo que dices que haga, pero nunca se me había ocurrido hasta que lo vi
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #5 (permalink)  
Antiguo 15/08/2007, 12:21
Avatar de iislas
Colaborador
 
Fecha de Ingreso: julio-2007
Ubicación: Mexico, D.F.
Mensajes: 6.482
Antigüedad: 16 años, 9 meses
Puntos: 180
Re: Procedimiento con WHERE opcional

Mithrandir

¿Y que hay de diferente en la propuesta tuya y la de Andres95?, Desde mi humilde punto de vista (si me lo permites), la de Andres95 tiene mas estetica

Saludos
  #6 (permalink)  
Antiguo 16/08/2007, 08:24
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Re: Procedimiento con WHERE opcional

Cita:
Iniciado por Mithrandir Ver Mensaje
Existe un super super super truco que me pirateé de algún código de por la red . Te permite hacer que las variables sean opcionales, si no tiene valor (null) entonces asume que no hay filtro y que verás todo:


CREATE PROCEDURE miproc(
@filtro int
)AS

SELECT cosa
FROM tabla
WHERE campo = @filtro OR @filtro IS NULL

De esa manera te evitas tener múltiples sentencias o tener que lidiar con el SQL dinámico.

No hay magia, ya que lo analicé es justo lo que dices que haga, pero nunca se me había ocurrido hasta que lo vi



Ese truco me lo enseño mi abuelita en access
  #7 (permalink)  
Antiguo 17/08/2007, 11:41
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años
Puntos: 25
Re: Procedimiento con WHERE opcional

¡Ahi van a echarle montón a mi pobre código...!

Ambos entregan los mismos resultados. El cual usar depende del gusto de cada quien. Lo que comenté implica <NULL = NULL> y la de Andrés <campo = campo>. Ambas terminan haciendo cierta la sentencia.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #8 (permalink)  
Antiguo 18/08/2007, 07:32
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Procedimiento con WHERE opcional

Orale!! Mi abuelita no sabe programar!!! entonces eres programador de Abuelengo..... o es abolengo? en fin....
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #9 (permalink)  
Antiguo 18/08/2007, 14:16
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Re: Procedimiento con WHERE opcional

Gabo... me caes bien. Me cae bien tu nick, se ajusta a lo que vivimos los de sistemas... pero... que tiene que ver tu abuelita y abolengo?
  #10 (permalink)  
Antiguo 18/08/2007, 16:55
Avatar de Gabo77  
Fecha de Ingreso: noviembre-2006
Mensajes: 381
Antigüedad: 17 años, 5 meses
Puntos: 6
Re: Procedimiento con WHERE opcional

Es un chiste.... por lo que veo no pegó.....

Por eso no fuí comediante

Saludos!
__________________
Hicimos un pacto con Dios... El no desarrolla Sistemas y nosotros no hacemos milagros....
  #11 (permalink)  
Antiguo 20/08/2007, 15:15
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años
Puntos: 47
Re: Procedimiento con WHERE opcional

tranquilo wey... hay días buenos, hay días malos...

YO también he tenido malos días
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 16:40.