none
Procedimiento parametrizado "between" devuelve consulta vacia RRS feed

  • 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 asc

    Pero 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

    GO

    ahi 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 asc

    me devuelve exactamente lo que espero

    gracias.


    lunes, 29 de agosto de 2016 19:20

Respuestas

  • Omar1316,


    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
    lunes, 29 de agosto de 2016 19:36
  • 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
    lunes, 29 de agosto de 2016 20:06

Todas las respuestas

  • Omar1316,


    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
    lunes, 29 de agosto de 2016 19:36
  • Muchas gracias, entendido lo que hay que hacer, ya lo pongo a prueba
    lunes, 29 de agosto de 2016 20:03
  • 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
    lunes, 29 de agosto de 2016 20:06
  • Me decante por esta opcion, muchas gracias
    lunes, 29 de agosto de 2016 21:04