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

IF en Store Procedure

Estas en el tema de IF en Store Procedure en el foro de SQL Server en Foros del Web. Hola, tengo un store procedure que recibe parametros, y segun esos parametros deberia agregar clausulas en el WHERE o no. Ahora, no se bien como ...
  #1 (permalink)  
Antiguo 12/06/2009, 07:54
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años, 5 meses
Puntos: 1
IF en Store Procedure

Hola, tengo un store procedure que recibe parametros, y segun esos parametros deberia agregar clausulas en el WHERE o no.
Ahora, no se bien como puedo hacer esto, me imagino que con un IF pero no se bien como aplicarlo (ni siquiera se si se puede).
Un ejemplo, tengo un parametro stock, que si su valor es distinto de cero deberia agregarse una clausula en el WHERE de la consulta de la forma

articulo.stock > @stock

y si es igual a cero, no deberia agregarse la clausula.

No puedo poner la clausula si o si ya que tengo un LEFT JOIN en el FORM y si coloco una clausula en el WHERE no me respeta el LEFT JOIN.

Espero me supe explicar (y me puedan ayudar)

Saludos
__________________
Nadie nacío sabiendo...
  #2 (permalink)  
Antiguo 12/06/2009, 09:38
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 16 años, 5 meses
Puntos: 220
Respuesta: IF en Store Procedure

puedes poner tu codigo para ver como lo estas haciendo
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #3 (permalink)  
Antiguo 12/06/2009, 09:50
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años, 5 meses
Puntos: 1
Respuesta: IF en Store Procedure

Código [code]:
Ver original
  1. ALTER PROCEDURE [dbo].[ArticulosPedidosCliente]  
  2.     @IdSuc      int = 0,
  3.         @Stock      int = 0
  4. AS
  5.     SELECT DISTINCT id_articulo, nombre, codigo, stock
  6.     FROM (
  7.             SELECT DISTINCT a.id_articulo, a.nombre, ap.codigo, isnull(asu.stock,0) as stock,
  8.             ROW_NUMBER() OVER (
  9.                                 ORDER BY
  10.                                     CASE    WHEN UPPER(@OrderBy) = 'PADRE' AND UPPER(@OrderSort) = 'ASC' THEN padre
  11.                                     END ASC,
  12.                                     CASE    WHEN UPPER(@OrderBy) = 'PADRE' AND UPPER(@OrderSort) = 'DESC' THEN padre
  13.                                     END DESC,
  14.                                     CASE    WHEN UPPER(@OrderBy) = 'RAZONSOCIAL' AND UPPER(@OrderSort) = 'ASC' THEN razonSocial
  15.                                     END ASC,
  16.                                     CASE    WHEN UPPER(@OrderBy) = 'RAZONSOCIAL' AND UPPER(@OrderSort) = 'DESC' THEN razonSocial
  17.                                     END DESC,
  18.                                     CASE    WHEN UPPER(@OrderBy) = 'NOMBRE' AND UPPER(@OrderSort) = 'ASC' THEN nombre
  19.                                     END ASC,
  20.                                     CASE    WHEN UPPER(@OrderBy) = 'NOMBRE' AND UPPER(@OrderSort) = 'DESC' THEN nombre
  21.                                     END DESC
  22.                                 ) AS RowNumber
  23.             FROM ARTICULO a JOIN ARTICULO_PROVEEDOR ap ON a.id_articulo = ap.id_articulo
  24.                  JOIN LINEA l ON a.id_linea = l.id_linea
  25.                  JOIN PROVEEDOR p ON ap.id_proveedor = p.id_proveedor
  26.                  LEFT JOIN ARTICULO_SUCURSAL asu ON a.id_articulo = asu.id_articulo AND asu.stock >= @Stock
  27.             WHERE
  28.                   asu.id_sucursal = CASE WHEN @IdSuc <> 0 THEN @IdSuc
  29.                                  ELSE asu.id_sucursal
  30.                                  END
  31.     ) AS Articulo  
  32.     WHERE RowNumber BETWEEN @PageSize * @PageNumber + 1
  33.                     AND @PageSize * (@PageNumber + 1)
Es un store procedure para paginacion de resultados.

El tema del stock esta mas o menos solucionado, pero tengo el mismo problema con el parametro "sucursal"; porque puedo filtrar o no los articulos por sucursal, si filtro por sucursal debo poner una clausula en el WHERE, si no, no. Y con lo que tengo actualmente me obliga a poner si o si una clausula en el WHERE, con lo que rompe mi LEFT JOIN ARTICULO_SUCURSAL.

Si no se entiende algo, aca estoy para despejar dudas
Saludos
__________________
Nadie nacío sabiendo...
  #4 (permalink)  
Antiguo 12/06/2009, 10:02
Avatar de Dradi7  
Fecha de Ingreso: junio-2008
Ubicación: Peru - Lima
Mensajes: 1.518
Antigüedad: 16 años, 5 meses
Puntos: 220
Respuesta: IF en Store Procedure

a ver prueba de la siguiente manera

((not @IdSuc = 0) and (asu.id_sucursal = @IdSuc))
__________________
La clave de todo triunfador es eliminar todas sus excusas y sus limitaciones
  #5 (permalink)  
Antiguo 12/06/2009, 10:41
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años, 5 meses
Puntos: 1
De acuerdo Respuesta: IF en Store Procedure

Bueno, parece que funciona!!!!!
No sabes la mano que me das con esto, no solo soluciono este problema puntual si un monton de problemas mas.

Gracias Dradi!!!!! cuando termine, te cuento como quedo....
__________________
Nadie nacío sabiendo...
  #6 (permalink)  
Antiguo 12/06/2009, 10:48
 
Fecha de Ingreso: marzo-2009
Mensajes: 9
Antigüedad: 15 años, 8 meses
Puntos: 0
Respuesta: IF en Store Procedure

Hola, lo que se hacer en estos casos es lo siguiente, te mando un ejemplo sencillo:

Create Procedure <nombre stored>
@param1 int = 0

declare @where varchar (8000)
declare @sql varchar (8000)

set @where = ' '

if @param1 > 0
begin
set @where = ' where column1 = ' + cast (@param1 as varchar )
end

set @sql = ' select * from tabla ' + @where

exec (@sql)


Como te dije es algo sencillo este ejemplo, pero a mi me sirve hacerlo de esta forma enstored mas complejos.

Espero te sirva de algo... Saludos
  #7 (permalink)  
Antiguo 12/06/2009, 10:51
 
Fecha de Ingreso: mayo-2004
Mensajes: 189
Antigüedad: 20 años, 5 meses
Puntos: 1
Respuesta: IF en Store Procedure

Gracias lcarrasco!!!! esto es mas o menos lo que buscaba, asi armo mi where como quiera.
Por ahora la solucion de Dradi me parece mejor ya que es menos codigo, pero esto me sirve para otras ocasiones.
Mil gracias
__________________
Nadie nacío sabiendo...
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 22:18.