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

Preguntas similare

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


Respuesta Responder a este mensaje
#2 JOMIJIMO
15/10/2006 - 19:36 | Informe spam
No entiendo lo que dices de que el CASE tiene que devolver un valor.

en lo que a continuacion te detallo creo que no es asi, y sin embargo
funciona perfectamente:

SELECT Category CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles

Me puedes aclarar algo más esta cuestion.

Por cierto gracias por tu respuesta, pero lo la solucion que me
propones ¿no es lo mismo que si genero la sentencia sql directamente
desde el programa que gestiona la BDD?
porque si es así no veo en que me beneficia hacer un SP. Con generarla
directamente en el programa bastaria

Gracias otra vez.
Respuesta Responder a este mensaje
#3 Alejandro Mesa
16/10/2006 - 15:00 | Informe spam
JOMIJIMO,

Vamos a ir por puntos.

1 -

No entiendo lo que dices de que el CASE tiene que devolver un valor.

en lo que a continuacion te detallo creo que no es asi, y sin embargo
funciona perfectamente:

SELECT Category > CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles

Me puedes aclarar algo más esta cuestion.



La expresion "case" devuelve un valor, no es una macro-substitucion. En una
expresion logica, deben haber operandos en ambos lados del operador, excepto
cuando negamos.

<operando_1> <operador> <operando_2>

En el ejmplo que posteastes, le dices a SQL Server que ejecute la sentencia
"select * from Asientos", a continuacion usas la expresion "case", lo cual se
interpreta como una nueva sentencia. Trata de ejecutar lo siguiente en "Query
analyzer":

use northwind
go

case when 1 = 1 then 'a' else 'b' end
go

SQL Server dara error, por esa sentencia por si solo no es una sentencia
permitida por SQL Server. Ese es el error que esta ocurriendo en tu
procedimiento. SQL Server no tiene la facilidad de macro-substitucion, pues
este no codigo interpretado.

2 -

Por cierto gracias por tu respuesta, pero lo la solucion que me
propones ¿no es lo mismo que si genero la sentencia sql directamente
desde el programa que gestiona la BDD?
porque si es así no veo en que me beneficia hacer un SP. Con generarla
directamente en el programa bastaria



Tomate tu tiempo y leete este articulo. Si despues de leerlo tienes todavia
dudas de por que usar un procedimiento almacenado, entonces postea tus
preguntas en el mismo hilo.

SQL Server y la Autoparametrización
http://www.configuracionesintegrale...articulo33


AMB


"JOMIJIMO" wrote:

No entiendo lo que dices de que el CASE tiene que devolver un valor.

en lo que a continuacion te detallo creo que no es asi, y sin embargo
funciona perfectamente:

SELECT Category > CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles

Me puedes aclarar algo más esta cuestion.

Por cierto gracias por tu respuesta, pero lo la solucion que me
propones ¿no es lo mismo que si genero la sentencia sql directamente
desde el programa que gestiona la BDD?
porque si es así no veo en que me beneficia hacer un SP. Con generarla
directamente en el programa bastaria

Gracias otra vez.


Respuesta Responder a este mensaje
#4 Alejandro Mesa
16/10/2006 - 15:27 | Informe spam
Olvide otro link muy importante sobre tu ultima pregunta.

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


AMB

"Alejandro Mesa" wrote:

JOMIJIMO,

Vamos a ir por puntos.

1 -

> No entiendo lo que dices de que el CASE tiene que devolver un valor.
>
> en lo que a continuacion te detallo creo que no es asi, y sin embargo
> funciona perfectamente:
>
> SELECT Category > > CASE type
> WHEN 'popular_comp' THEN 'Popular Computing'
> WHEN 'mod_cook' THEN 'Modern Cooking'
> WHEN 'business' THEN 'Business'
> WHEN 'psychology' THEN 'Psychology'
> WHEN 'trad_cook' THEN 'Traditional Cooking'
> ELSE 'Not yet categorized'
> END,
> CAST(title AS varchar(25)) AS 'Shortened Title',
> price AS Price
> FROM titles
>
> Me puedes aclarar algo más esta cuestion.

La expresion "case" devuelve un valor, no es una macro-substitucion. En una
expresion logica, deben haber operandos en ambos lados del operador, excepto
cuando negamos.

<operando_1> <operador> <operando_2>

En el ejmplo que posteastes, le dices a SQL Server que ejecute la sentencia
"select * from Asientos", a continuacion usas la expresion "case", lo cual se
interpreta como una nueva sentencia. Trata de ejecutar lo siguiente en "Query
analyzer":

use northwind
go

case when 1 = 1 then 'a' else 'b' end
go

SQL Server dara error, por esa sentencia por si solo no es una sentencia
permitida por SQL Server. Ese es el error que esta ocurriendo en tu
procedimiento. SQL Server no tiene la facilidad de macro-substitucion, pues
este no codigo interpretado.

2 -

> Por cierto gracias por tu respuesta, pero lo la solucion que me
> propones ¿no es lo mismo que si genero la sentencia sql directamente
> desde el programa que gestiona la BDD?
> porque si es así no veo en que me beneficia hacer un SP. Con generarla
> directamente en el programa bastaria

Tomate tu tiempo y leete este articulo. Si despues de leerlo tienes todavia
dudas de por que usar un procedimiento almacenado, entonces postea tus
preguntas en el mismo hilo.

SQL Server y la Autoparametrización
http://www.configuracionesintegrale...articulo33


AMB


"JOMIJIMO" wrote:

> No entiendo lo que dices de que el CASE tiene que devolver un valor.
>
> en lo que a continuacion te detallo creo que no es asi, y sin embargo
> funciona perfectamente:
>
> SELECT Category > > CASE type
> WHEN 'popular_comp' THEN 'Popular Computing'
> WHEN 'mod_cook' THEN 'Modern Cooking'
> WHEN 'business' THEN 'Business'
> WHEN 'psychology' THEN 'Psychology'
> WHEN 'trad_cook' THEN 'Traditional Cooking'
> ELSE 'Not yet categorized'
> END,
> CAST(title AS varchar(25)) AS 'Shortened Title',
> price AS Price
> FROM titles
>
> Me puedes aclarar algo más esta cuestion.
>
> Por cierto gracias por tu respuesta, pero lo la solucion que me
> propones ¿no es lo mismo que si genero la sentencia sql directamente
> desde el programa que gestiona la BDD?
> porque si es así no veo en que me beneficia hacer un SP. Con generarla
> directamente en el programa bastaria
>
> Gracias otra vez.
>
>
Respuesta Responder a este mensaje
#5 Carlos Sacristán
17/10/2006 - 08:36 | Informe spam
Felicidades por el artículo, Alejandro. Creo que está muy claro, lo
añadiré a los enalces favoritos cuando salga este tema (muy comentado, por
cierto)


Un saludo

-
"Sólo sé que no sé nada. " (Sócrates)

"Alejandro Mesa" escribió en el
mensaje news:
JOMIJIMO,

Vamos a ir por puntos.

1 -

No entiendo lo que dices de que el CASE tiene que devolver un valor.

en lo que a continuacion te detallo creo que no es asi, y sin embargo
funciona perfectamente:

SELECT Category >> CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles

Me puedes aclarar algo más esta cuestion.



La expresion "case" devuelve un valor, no es una macro-substitucion. En
una
expresion logica, deben haber operandos en ambos lados del operador,
excepto
cuando negamos.

<operando_1> <operador> <operando_2>

En el ejmplo que posteastes, le dices a SQL Server que ejecute la
sentencia
"select * from Asientos", a continuacion usas la expresion "case", lo cual
se
interpreta como una nueva sentencia. Trata de ejecutar lo siguiente en
"Query
analyzer":

use northwind
go

case when 1 = 1 then 'a' else 'b' end
go

SQL Server dara error, por esa sentencia por si solo no es una sentencia
permitida por SQL Server. Ese es el error que esta ocurriendo en tu
procedimiento. SQL Server no tiene la facilidad de macro-substitucion,
pues
este no codigo interpretado.

2 -

Por cierto gracias por tu respuesta, pero lo la solucion que me
propones ¿no es lo mismo que si genero la sentencia sql directamente
desde el programa que gestiona la BDD?
porque si es así no veo en que me beneficia hacer un SP. Con generarla
directamente en el programa bastaria



Tomate tu tiempo y leete este articulo. Si despues de leerlo tienes
todavia
dudas de por que usar un procedimiento almacenado, entonces postea tus
preguntas en el mismo hilo.

SQL Server y la Autoparametrización
http://www.configuracionesintegrale...articulo33


AMB


"JOMIJIMO" wrote:

No entiendo lo que dices de que el CASE tiene que devolver un valor.

en lo que a continuacion te detallo creo que no es asi, y sin embargo
funciona perfectamente:

SELECT Category >> CASE type
WHEN 'popular_comp' THEN 'Popular Computing'
WHEN 'mod_cook' THEN 'Modern Cooking'
WHEN 'business' THEN 'Business'
WHEN 'psychology' THEN 'Psychology'
WHEN 'trad_cook' THEN 'Traditional Cooking'
ELSE 'Not yet categorized'
END,
CAST(title AS varchar(25)) AS 'Shortened Title',
price AS Price
FROM titles

Me puedes aclarar algo más esta cuestion.

Por cierto gracias por tu respuesta, pero lo la solucion que me
propones ¿no es lo mismo que si genero la sentencia sql directamente
desde el programa que gestiona la BDD?
porque si es así no veo en que me beneficia hacer un SP. Con generarla
directamente en el programa bastaria

Gracias otra vez.


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida