Principales respuestas
pregunta sobre sqlserver 2008r2

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))
ENDcuando 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
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.
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ viernes, 1 de febrero de 2013 15:00
-
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;
GOEn 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;
GOComo puedes notar, yo no converti @n y @i a caracter para concatenar sino que les declaro como parametros y luego paso los valores.
AMB
- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator viernes, 1 de febrero de 2013 8:18
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ 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)';
ENDSi 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
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ miércoles, 6 de febrero de 2013 3:10
-
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) + '%'''
ENDgracias
hugo bermudez
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ lunes, 11 de febrero de 2013 20:24
-
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 + '%'''
ENDy el parametro de entrada lo cambie a varchar y listo mejoro el rendimiento de el script
gracias por su colaboracion
HUGO BERMUDEZ
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ lunes, 11 de febrero de 2013 20:24
Todas las respuestas
-
-
-
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
-
-
-
-
-
-
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.
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ viernes, 1 de febrero de 2013 15:00
-
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 -
-
-
-
-
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;
GOEn 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;
GOComo puedes notar, yo no converti @n y @i a caracter para concatenar sino que les declaro como parametros y luego paso los valores.
AMB
- Propuesto como respuesta Alberto López Grande (qwalgrande)Moderator viernes, 1 de febrero de 2013 8:18
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ viernes, 1 de febrero de 2013 14:58
-
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) + '%'''
ENDgracias
hugo bermudez
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ lunes, 11 de febrero de 2013 20:24
-
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)';
ENDSi 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
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ miércoles, 6 de febrero de 2013 3:10
-
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 + '%'''
ENDy el parametro de entrada lo cambie a varchar y listo mejoro el rendimiento de el script
gracias por su colaboracion
HUGO BERMUDEZ
- Marcado como respuesta HUGO BERMUDEZ GUTIERREZ lunes, 11 de febrero de 2013 20:24