Filtro en tiempo de ejecucion

15/10/2006 - 16:00 por JOMIJIMO | Informe spam
Me gustaria si alguien me puede ayudar.

Tengo un SP para recuperar los registros de una tabla.
Ciertos campos de esta tabla deben cumplir ciertas condiciones.

Hasta aqui todo bien, ya que he creado parametros para esto campos.

Pero, como siempre hay un pero..

Necesito tambien que además del valor de cada parametro se le pasa al
SP el operador por el que debe comparar ( = > < <> Between
etc, etc, etc)

Lo intenté asi pero me da un error:

ALTER PROCEDURE qry_PRUEBAS001

(@FechaAsiento NVARCHAR(6),
@OperadorFecha Nvarchar(2),
@IdCta NVARCHAR(50))

AS

SELECT * FROM Asientos

CASE @OperadorFecha
WHEN '=' THEN WHERE Fecha_Asiento = @FechaAsiento AND
WHEN '<' THEN WHERE Fecha_Asiento < @FechaAsiento AND
WHEN '>' THEN WHERE Fecha_Asiento > @FechaAsiento AND
WHEN '>=' THEN WHERE Fecha_Asiento >= @FechaAsiento AND
WHEN '<=' THEN WHERE Fecha_Asiento <= @FechaAsiento AND
WHEN '<>' THEN WHERE Fecha_Asiento <> @FechaAsiento AND
END

Id_Cuenta = @IdCta


Alquien me puede ayudar.?

Gracias
 

Leer las respuestas

#1 Alejandro Mesa
15/10/2006 - 17:11 | Informe spam
JOMIJIMO,

La expresion "case"debe devolver un valor. Para lograr lo que deseas puedes
usar sql dinamico, que no es ams que armar la sentencia dinamicamente en
dependencia de los parametros de entrada.

declare @sql nvarchar(4000)
declare @params nvarchar(4000)
declare @FechaAsiento NVARCHAR(6), @IdCta NVARCHAR(50)

set @params = N'declare @FechaAsiento NVARCHAR(6), @IdCta NVARCHAR(50)'
set @sql = N'SELECT * FROM dbo.Asientos where 1 = 1'

if @OperadorFecha = '='
set @sql = @sql + N' and Fecha_Asiento = @FechaAsiento'

if @OperadorFecha = '='
set @sql = @sql + N' and Fecha_Asiento = @FechaAsiento'

if @OperadorFecha = '<'
set @sql = @sql + N' and Fecha_Asiento < @FechaAsiento'

if @OperadorFecha = '>'
set @sql = @sql + N' and Fecha_Asiento > @FechaAsiento'

set @sql = @sql + N' and Id_Cuenta = @IdCta'

set @FechaAsiento = '200610'
set @IdCta = '12345'

exec dbo.sp_executesql @sql, @params, @FechaAsiento, @IdCta
go

Las virtudes y maldades del SQL dinámico
http://www.hayes.ch/sql/sql_dinamico.html


AMB

"JOMIJIMO" wrote:

Me gustaria si alguien me puede ayudar.

Tengo un SP para recuperar los registros de una tabla.
Ciertos campos de esta tabla deben cumplir ciertas condiciones.

Hasta aqui todo bien, ya que he creado parametros para esto campos.

Pero, como siempre hay un pero..

Necesito tambien que además del valor de cada parametro se le pasa al
SP el operador por el que debe comparar ( = > < <> Between
etc, etc, etc)

Lo intenté asi pero me da un error:

ALTER PROCEDURE qry_PRUEBAS001

(@FechaAsiento NVARCHAR(6),
@OperadorFecha Nvarchar(2),
@IdCta NVARCHAR(50))

AS

SELECT * FROM Asientos

CASE @OperadorFecha
WHEN '=' THEN WHERE Fecha_Asiento = @FechaAsiento AND
WHEN '<' THEN WHERE Fecha_Asiento < @FechaAsiento AND
WHEN '>' THEN WHERE Fecha_Asiento > @FechaAsiento AND
WHEN '>=' THEN WHERE Fecha_Asiento >= @FechaAsiento AND
WHEN '<=' THEN WHERE Fecha_Asiento <= @FechaAsiento AND
WHEN '<>' THEN WHERE Fecha_Asiento <> @FechaAsiento AND
END

Id_Cuenta = @IdCta


Alquien me puede ayudar.?

Gracias


Preguntas similares