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

Cómo formar un WHERE DINAMICO

Estas en el tema de Cómo formar un WHERE DINAMICO en el foro de SQL Server en Foros del Web. Hola amigos,... tengo problemas cuando trato de formar un WHERE dinamico select * FROM dbo.Cmp_LiqImp AS li INNER JOIN dbo.Cmp_LiqImpFactura AS lif INNER JOIN dbo.Cmp_Compra ...
  #1 (permalink)  
Antiguo 26/10/2007, 13:55
Avatar de LUISESPOCH  
Fecha de Ingreso: octubre-2006
Mensajes: 194
Antigüedad: 17 años, 6 meses
Puntos: 0
Cómo formar un WHERE DINAMICO

Hola amigos,...
tengo problemas cuando trato de formar un WHERE dinamico

select *
FROM
dbo.Cmp_LiqImp AS li INNER JOIN dbo.Cmp_LiqImpFactura AS lif
INNER JOIN dbo.Cmp_Compra AS com ON
and li.IdEmpresa=@PI_IdEmpresa
and li.IdOficina=@PI_IdOficina
and (

(case @PI_IdCriterio
when 1 then li.IdLiqImp=CAST(@PI_Criterio AS INT) --// #Liquid
when 2 then detcom.GuiaRemision=@PI_Criterio --// #Guia
when 3 then li.IdOC=@PI_Criterio --// #OC
)

or

@PI_Criterio is null)
donde

@PI_IdCriterio puede tomar valor de
1= si se quiere comparar con una columna tipo NUMERICO ENTERO
2= si se quiere comparar con una columna tipo STRING
3= si se quiere comparar con una columna tipo NUMERICO ENTERO

ME SALE ERROR DE SINTAXIS, alguien me puede por favor ayudar??

Gracias.

Luis
  #2 (permalink)  
Antiguo 26/10/2007, 16:59
 
Fecha de Ingreso: noviembre-2006
Ubicación: México
Mensajes: 866
Antigüedad: 17 años, 5 meses
Puntos: 8
Re: Cómo formar un WHERE DINAMICO

Que tal Luis.

A la parte de Case, le falta la palabra END, debe ser:
Código:
CASE variable
    WHEN algun_valor THEN resultado
        [ ...n ] 
    [ 
        ELSE tro_ resultado
    ] 
END  
Y tu variable @PI_IdCriterio debe ser del tipo entero, sino lo es, puede usar las funciones CAST y CONVERT.

Saludos!
  #3 (permalink)  
Antiguo 27/10/2007, 17:45
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 4 meses
Puntos: 38
De acuerdo Re: Cómo formar un WHERE DINAMICO

Código:
select *
FROM 	dbo.Cmp_LiqImp AS li 
INNER JOIN 
	dbo.Cmp_LiqImpFactura AS lif 
ON      (Falta condiciones de union)
INNER JOIN 
	dbo.Cmp_Compra AS detcom ON   
	1 = (Case When @PI_IdCriterio is null Then 1 
              Else
                 case @PI_IdCriterio  
  		      when 1 then Case When li.IdLiqImp = CAST(@PI_Criterio AS INT) Then 1 Else 0 End --// #Liquid
		      when 2 then Case When detcom.GuiaRemision = @PI_Criterio      Then 1 Else 0 End --// #Guia
		      when 3 then Case When li.IdOC = @PI_Criterio                  Then 1 Else 0 End --// #OC
	         End
	      End 
	   )
Where li.IdEmpresa=@PI_IdEmpresa  And
      li.IdOficina=@PI_IdOficina
aunque seria mejor que enviaras tal cual los parametros de cada tabla, ya que eso de tener un solo parametro y un identificador para saber a que tabla va a filtar hace las cosas mas confunsas y propensas a errores....

Saludos!
__________________
La sencillez y naturalidad son el supremo y último fin de la cultura...
--
MCTS : SQL Server 2008, .NET Framework 3.5, ASP.NET Applications.
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:08.