none
pregunta sobre sqlserver 2008r2 RRS feed

  • Pregunta

  • buenas tardes, tengo un sp en sqlserver2008r2 y estoy realizando una busqueda dentro del sp, lo cual lo estoy generando con inner join y tengo esto

    IF @enti_nit != ''  and @enti_nit IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE 'SELECT CONVERT(varchar(13),'AND', CONVERT(numeric(13),@enti_nit))
    END

    cuando lo compilo me ejecuta bien, pero cuando pruebo el sp, me arroja un error de que no se puede convertir numeric to varchar line **, quisiera que me ayudaran como puedo hacer esto de la forma que me funcione, gracias buenas tardes

    hugo bermudez

    miércoles, 30 de enero de 2013 18:54

Respuestas

  • Uhm bueno el código que me enviaste del procedure efectivamente daba el error que copiaste pero al correrlo en mi Sql no tuve errores:

    declare @enti_nit as varchar(10)
    declare @FILTROWHERE as varchar(10)
    
    IF @enti_nit != ''  and @enti_nit IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE '  SELECT CONVERT(varchar(13),'AND') SELECT CONVERT(numeric(13),@enti_nit)
    END

    Posiblemente tu problema viene antes.

    miércoles, 30 de enero de 2013 20:45
  • Esta linea dara error:

    > IF @enti_nit != ''  and @enti_nit IS NOT NULL
    > BEGIN
    > SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE '  SELECT CONVERT(varchar(13),'AND')
    > SELECT CONVERT> (numeric(13),@enti_nit)
    > END

    El problema se da porque no podemos convertir la cadena vacia ('' ) a numerico.

    Ejemplo:

    select cast('' as numeric(13)) as c1;
    GO

    En cuanto a tu pregunta sobre:

    > para eso le hago el convert de numeric a varchar, si hay alguna forma de concatenar una variable numeric, pues creo
    > que seria mejor que estar convirtiendo.

    La solucion esta en usar sp_executesql y parametrizar tu sentencia envez de concatenar.

    Ejemplo:

    exec sp_executesql N'select c1, c2, c3 + @n as c4 fro T where c1 = @i', N'@n numeric(13), @i int', 6, 4;
    GO

    Como puedes notar, yo no converti @n y @i a caracter para concatenar sino que les declaro como parametros y luego paso los valores.


    AMB

    Some guidelines for posting questions...

    jueves, 31 de enero de 2013 14:03
  • Me alegra que tengas una solucion para tu problema, pero me temo que algo no nos dices y que puede mejorar tu sentencia.

    Por ejemplo, me pregunto el por que declaras el parametro "@enti_nit" como "numeric(13)" pero usas el operador LIKE para la comparacion de la columna con el parametro:

    > SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE ' + '''%' + CONVERT(varchar(13),@enti_nit) + '%'''

    Primero me gustaria saber cual es el tipo de data de la columna, y segundo que es lo que intentas hacer en la busqueda.

    Si el parametro contiene la marca NULL y deseas que no se aplique filtro alguno a la columna para este caso, entonces ganaras mas si no incorporas esa expresion en el filtro.

    IF @enti_nit IS NOT NULL
        SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit = @enti_nit)';
    END

    Si usas el procedimeinto sp_executesql para ejecutar el sql dinamico, entonces solo te queda declarar el parametro y pasar su valor.

    EXEC sp_executesql @EJECUTARSQL, N'@enti_nit numeric(13)', @enti_nit;

    Si la columna es de tipo caracter, entonces usa el tipo adecuado para el parametro.


    AMB

    Some guidelines for posting questions...

    lunes, 4 de febrero de 2013 13:52
  • gracias por sus respuestas, despues de mucho leer y buscar por san google encontre un ejemplo que me sirvio y lo solucione de esta forma

    IF CONVERT(varchar(13),@enti_nit) != '0'  and @enti_nit IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE ' + '''%' + CONVERT(varchar(13),@enti_nit) + '%'''
    END

    gracias

    hugo bermudez

    viernes, 1 de febrero de 2013 14:58
  • pues ahora ya modifique, para mejorar el rendimiento y lo deje asi

    IF @enti_nit != '0' and @enti_nit !='' and @enti_nit IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE ' + '''%' + @enti_nit + '%'''
    END

    y el parametro de entrada lo cambie a varchar y listo mejoro el rendimiento de el script

    gracias por su colaboracion

    HUGO BERMUDEZ

    miércoles, 6 de febrero de 2013 3:10

Todas las respuestas

  • IF NULLIF(@enti_nit, '') IS NOT NULL

    si no lo que puedes hacer es convertir a texto

    IF convert(varchar, convert(bigint, @enti_nit)) != ''  and @enti_nit IS NOT NULL


    Gracias Ing. Salomon Bagdadi

    miércoles, 30 de enero de 2013 19:25
  • grcias por la respuesta pero aun me sigue saliendo el mismo error, Msg 8114, Level 16, State 5, Procedure PA_CONSULTAR_CONTRATOSXPROVEEDORES, Line 66
    Error converting data type varchar to numeric.

    gracias 

    hugo bermudez

    miércoles, 30 de enero de 2013 19:42
  • SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE 'SELECT CONVERT(varchar(13),'AND', CONVERT(numeric(13),@enti_nit))

    Esta fila es la que te debe traer el problema cuando concatenas fíjate bien en los apostrofes y los signos de + si vas a seguir concatenando. Suerte

    miércoles, 30 de enero de 2013 19:51
  • Msg 8116, Level 16, State 1, Procedure PA_CONSULTAR_CONTRATOSXPROVEEDORES, Line 68
    Argument data type numeric is invalid for argument 3 of convert function.

    pues he revisado varias veces y no se si estoy obviado algo, 

    miércoles, 30 de enero de 2013 20:01
  • Ese error aparece porque estas haciendo mal una conversión
    miércoles, 30 de enero de 2013 20:10
  • the question es donde, gracias por la colaboracion

    hugo bermudez

    miércoles, 30 de enero de 2013 20:15
  • Haber prueba con esto:

    SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE '  SELECT CONVERT(varchar(13),'AND') SELECT CONVERT(numeric(13),@enti_nit)

    miércoles, 30 de enero de 2013 20:31
  • jose barba gracias, pero no ha funcionado ya no me sale el mensaje anterior, me sale el primero el de Error converting data type varchar to numeric.
    miércoles, 30 de enero de 2013 20:38
  • Uhm bueno el código que me enviaste del procedure efectivamente daba el error que copiaste pero al correrlo en mi Sql no tuve errores:

    declare @enti_nit as varchar(10)
    declare @FILTROWHERE as varchar(10)
    
    IF @enti_nit != ''  and @enti_nit IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE '  SELECT CONVERT(varchar(13),'AND') SELECT CONVERT(numeric(13),@enti_nit)
    END

    Posiblemente tu problema viene antes.

    miércoles, 30 de enero de 2013 20:45
  • nada men, me sigue arrojando error, aca coloco todo el sp, para que veas todo el codigo que tengo, gracias

    ALTER PROCEDURE [dbo].[PA_CONSULTAR_CONTRATOSXPROVEEDORES]

    @prov_cednit varchar(13),
    @rcto_fecdesde date = NULL,
    @rcto_fechasta date = NULL,
    @rcto_nrocto varchar(6)=NULL,
    @esta_nombre varchar(80)=NULL,
    @enti_nit numeric(13) = NULL

    --[PA_CONSULTAR_CONTRATOSXPROVEEDORES] '8110031383','','','','','86051107169'
    AS
    BEGIN
    DECLARE @EJECUTARSQL AS VARCHAR(1000)
    DECLARE @FILTROWHERE AS VARCHAR(500)

    SET @FILTROWHERE =  'WHERE    0 = 0 and prove.prov_cednit = ' + char(39) + @prov_cednit + char(39)

    SET @EJECUTARSQL = 'SELECT     prove.prov_cednit, prove.prov_razonsocial, cto.rcto_Objcto, cto.rcto_vlrcto, cto.rcto_nrocto, cto.rcto_anocto, cto.rcto_fecdesde, cto.rcto_fechasta, esta.esta_nombre, 
    cto.enti_nit
    FROM         LC_REGCTO AS cto INNER JOIN
                          LC_ESTADOCTO AS esta ON cto.esta_codigo = esta.esta_codigo INNER JOIN
                          AL_PROVEE AS prove ON cto.prov_cednit = prove.prov_cednit INNER JOIN
                          LC_ENTIDADES ON cto.enti_nit = LC_ENTIDADES.enti_nit '
     



    IF @rcto_fecdesde != '1900-01-01' and  @rcto_fechasta = '1900-01-01' 
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND cto.rcto_fecdesde between ' + char(39) + convert(varchar,@rcto_fecdesde) + char(39) + 
     'and' +  char(39) + convert(varchar,@rcto_fecdesde) + char(39)
    END

    IF @rcto_fechasta  != '1900-01-01'  and @rcto_fecdesde = '1900-01-01'
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND cto.rcto_fecdesde between ' + char(39) + convert(varchar,@rcto_fechasta) + char(39) +
    'and' +  char(39) + convert(varchar,@rcto_fechasta) + char(39)
    END

    IF @rcto_fecdesde != '1900-01-01' and  @rcto_fechasta != '1900-01-01' 
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND cto.rcto_fecdesde between ' + char(39) + convert(varchar,@rcto_fecdesde) + char(39) + 
     'and' +  char(39) + convert(varchar,@rcto_fechasta) + char(39)
    END

    IF @esta_nombre != '' and @esta_nombre != 'Todos los Estados' and @esta_nombre IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND esta.esta_nombre LIKE ' + '''%' +  @esta_nombre + '%'''
    END

    IF @enti_nit != ''  and @enti_nit IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE '  SELECT CONVERT(varchar(13),'AND') SELECT CONVERT(numeric(13),@enti_nit)
    END

    IF @rcto_nrocto != ''  and @rcto_nrocto IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND cto.rcto_nrocto LIKE ' + '''%' +  @rcto_nrocto + '%'''
    END



    SET @EJECUTARSQL += @FILTROWHERE + ' ORDER BY cto.rcto_nrocto'
    EXEC (@EJECUTARSQL)
    PRINT @EJECUTARSQL
    END

    miércoles, 30 de enero de 2013 20:53
  • Arriba declaras:

    @enti_nit numeric(13) = NULL

    porque realizas esta acción?

    SELECT CONVERT(numeric(13),@enti_nit)

    miércoles, 30 de enero de 2013 21:12
  • pues como asi?? yo declaro arriba los parametros de entrada del sp, son 6 uno de ellos es enti_nit que en la bd lo tengo definido como numeric(13)
    miércoles, 30 de enero de 2013 21:27
  • claro pero si lo tienes ya definido como numeric porque le haces el convert?
    miércoles, 30 de enero de 2013 21:45
  • lo que pasa es que no lo he podido concatenar, para eso le hago el convert de numeric a varchar, si hay alguna forma de concatenar una variable numeric, pues creo que seria mejor que estar convirtiendo.

    hugo bermudez 

    miércoles, 30 de enero de 2013 21:53
  • Esta linea dara error:

    > IF @enti_nit != ''  and @enti_nit IS NOT NULL
    > BEGIN
    > SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE '  SELECT CONVERT(varchar(13),'AND')
    > SELECT CONVERT> (numeric(13),@enti_nit)
    > END

    El problema se da porque no podemos convertir la cadena vacia ('' ) a numerico.

    Ejemplo:

    select cast('' as numeric(13)) as c1;
    GO

    En cuanto a tu pregunta sobre:

    > para eso le hago el convert de numeric a varchar, si hay alguna forma de concatenar una variable numeric, pues creo
    > que seria mejor que estar convirtiendo.

    La solucion esta en usar sp_executesql y parametrizar tu sentencia envez de concatenar.

    Ejemplo:

    exec sp_executesql N'select c1, c2, c3 + @n as c4 fro T where c1 = @i', N'@n numeric(13), @i int', 6, 4;
    GO

    Como puedes notar, yo no converti @n y @i a caracter para concatenar sino que les declaro como parametros y luego paso los valores.


    AMB

    Some guidelines for posting questions...

    jueves, 31 de enero de 2013 14:03
  • gracias por sus respuestas, despues de mucho leer y buscar por san google encontre un ejemplo que me sirvio y lo solucione de esta forma

    IF CONVERT(varchar(13),@enti_nit) != '0'  and @enti_nit IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE ' + '''%' + CONVERT(varchar(13),@enti_nit) + '%'''
    END

    gracias

    hugo bermudez

    viernes, 1 de febrero de 2013 14:58
  • Me alegra que tengas una solucion para tu problema, pero me temo que algo no nos dices y que puede mejorar tu sentencia.

    Por ejemplo, me pregunto el por que declaras el parametro "@enti_nit" como "numeric(13)" pero usas el operador LIKE para la comparacion de la columna con el parametro:

    > SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE ' + '''%' + CONVERT(varchar(13),@enti_nit) + '%'''

    Primero me gustaria saber cual es el tipo de data de la columna, y segundo que es lo que intentas hacer en la busqueda.

    Si el parametro contiene la marca NULL y deseas que no se aplique filtro alguno a la columna para este caso, entonces ganaras mas si no incorporas esa expresion en el filtro.

    IF @enti_nit IS NOT NULL
        SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit = @enti_nit)';
    END

    Si usas el procedimeinto sp_executesql para ejecutar el sql dinamico, entonces solo te queda declarar el parametro y pasar su valor.

    EXEC sp_executesql @EJECUTARSQL, N'@enti_nit numeric(13)', @enti_nit;

    Si la columna es de tipo caracter, entonces usa el tipo adecuado para el parametro.


    AMB

    Some guidelines for posting questions...

    lunes, 4 de febrero de 2013 13:52
  • pues ahora ya modifique, para mejorar el rendimiento y lo deje asi

    IF @enti_nit != '0' and @enti_nit !='' and @enti_nit IS NOT NULL
    BEGIN
    SET @FILTROWHERE = @FILTROWHERE + ' AND LC_ENTIDADES.enti_nit LIKE ' + '''%' + @enti_nit + '%'''
    END

    y el parametro de entrada lo cambie a varchar y listo mejoro el rendimiento de el script

    gracias por su colaboracion

    HUGO BERMUDEZ

    miércoles, 6 de febrero de 2013 3:10