Principales respuestas
Procedimiento parametrizado "between" devuelve consulta vacia

Pregunta
-
Buenas. Tengo formulada esta consulta
@parametro1 varchar(1),
@parametro2 varchar(1),
@col varchar(50)
as
select nombre_cliente,razon_social_cliente,cuit_cliente,ing_brutos_cliente,pag_web_cliente,f_alta_cliente
from cliente
where @col between @parametro1 and @parametro2
order by nombre_cliente ascPero cuando intento ejecutarla (desde sql) me devuelve la tabla vacia salvo que introduzca los parametros a and z asi
DECLARE @return_value int
EXEC @return_value = [dbo].[consulta_cliente2]
@parametro1 = N'a',
@parametro2 = N'z',
@col = N'nombre_cliente'
SELECT 'Return Value' = @return_value
GOahi devuelve toda la tabla, pero cualquier modificacion de parametros que haga (supongamos a and j) ya me devuelve vacia la tabla.
¿hay algo que se me esta escapando?
La consulta no tiene nada de compleja, de hecho haciendo un
select nombre_cliente,razon_social_cliente,cuit_cliente,ing_brutos_cliente,pag_web_cliente,f_alta_cliente
from cliente
where nombre_cliente between 'b' and 'fz'
order by nombre_cliente ascme devuelve exactamente lo que espero
gracias.
Respuestas
-
La consulta tal y como la tienes no interpreta el valor del parámetro '@col' como un objeto de base de datos sino como un valor escalar, por eso es de esperar el resultado que obtienes. Para lograr tu objetivo necesitas convertir la consulta a texto, concatenando los parámetros para luego ejecutarlo con el procedimiento sp_executesql (consultas dinámicas), de hecho, hace un momento hubo una pregunta referida al caso, te dejo el enlace variable escalar entre comillas simples en procedimiento, analiza las respuestas y acomoda a tu caso, si tienes alguna duda puedes consultarlo.
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.- Propuesto como respuesta HunchbackMVP lunes, 29 de agosto de 2016 19:56
- Marcado como respuesta Omar1316 lunes, 29 de agosto de 2016 20:02
-
Como bien comento Willams, la consulta esta evaluando la sgte expresion de acuerdo al valor que pasas:
...
where 'nombre_cliente' between 'a' and 'j';Como vez, compara la cadena 'nombre_cliente' contra los valores 'a' y 'j'. La comparacion se hace character por caracter y como 'n' es menor que 'j' entonces la expresion es falsa y no devuelve fila alguna.
select
case when 'nombre_cliente' between 'a' and 'j' then 1 else 0 end as col1,
case when 'nombre_cliente' between 'b' and 'fz' then 1 else 0 end as col2,
case when 'nombre_cliente' between 'a' and 'z' then 1 else 0end as col3;
GO
exec sp_executesql N'select * from dbo.cliente where nombre_cliente between @p1 and @p2;'N'@p1 varchar(50), @p2 varchar(50)', 'a', 'j';
GO
Los nombres de objetos de la base no se pueden parametrizar, asi que tocara concatenar para armar la query y parametrizar lo que mas se pueda.
La mejor opcion es usar un procedimiento por cada columna que desees indagar y un procedimiento principal que llame al adecuado de acuerdo al valor del parametro que indica la columna.
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Marcado como respuesta Omar1316 lunes, 29 de agosto de 2016 21:04
Todas las respuestas
-
La consulta tal y como la tienes no interpreta el valor del parámetro '@col' como un objeto de base de datos sino como un valor escalar, por eso es de esperar el resultado que obtienes. Para lograr tu objetivo necesitas convertir la consulta a texto, concatenando los parámetros para luego ejecutarlo con el procedimiento sp_executesql (consultas dinámicas), de hecho, hace un momento hubo una pregunta referida al caso, te dejo el enlace variable escalar entre comillas simples en procedimiento, analiza las respuestas y acomoda a tu caso, si tienes alguna duda puedes consultarlo.
Espero que la información proporcionada te haya sido de utilidad, quedo atento a tus comentarios.- Propuesto como respuesta HunchbackMVP lunes, 29 de agosto de 2016 19:56
- Marcado como respuesta Omar1316 lunes, 29 de agosto de 2016 20:02
-
-
Como bien comento Willams, la consulta esta evaluando la sgte expresion de acuerdo al valor que pasas:
...
where 'nombre_cliente' between 'a' and 'j';Como vez, compara la cadena 'nombre_cliente' contra los valores 'a' y 'j'. La comparacion se hace character por caracter y como 'n' es menor que 'j' entonces la expresion es falsa y no devuelve fila alguna.
select
case when 'nombre_cliente' between 'a' and 'j' then 1 else 0 end as col1,
case when 'nombre_cliente' between 'b' and 'fz' then 1 else 0 end as col2,
case when 'nombre_cliente' between 'a' and 'z' then 1 else 0end as col3;
GO
exec sp_executesql N'select * from dbo.cliente where nombre_cliente between @p1 and @p2;'N'@p1 varchar(50), @p2 varchar(50)', 'a', 'j';
GO
Los nombres de objetos de la base no se pueden parametrizar, asi que tocara concatenar para armar la query y parametrizar lo que mas se pueda.
La mejor opcion es usar un procedimiento por cada columna que desees indagar y un procedimiento principal que llame al adecuado de acuerdo al valor del parametro que indica la columna.
AMB
Some guidelines for posting questions...
AYÚDANOS A AYUDARTE, guía básica de consejos para formular preguntas- Marcado como respuesta Omar1316 lunes, 29 de agosto de 2016 21:04
-