Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » SQL Server »

Error: is not a valid identifier

Estas en el tema de Error: is not a valid identifier en el foro de SQL Server en Foros del Web. HOla amigos por aca. Tengo un problema tonto que no se como solucionar. Este es mi codigo: Código: set @sql = @sql + 'SELECT IdRequerimiento ...
  #1 (permalink)  
Antiguo 14/09/2006, 10:00
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años, 5 meses
Puntos: 47
Pregunta Error: is not a valid identifier

HOla amigos por aca. Tengo un problema tonto que no se como solucionar. Este es mi codigo:

Código:
set @sql = @sql + 'SELECT IdRequerimiento as Requerimiento,'
set @sql = @sql + 'IdDetRequerimiento as Item,'
set @sql = @sql + '(SELECT SIGE_Inventario.dbo.Inv_F_DescripArticulo(IdEmpresa, IdItem)) as Descripcion,'
set @sql = @sql + 'SUM(CantidadSolicitada),'
set @sql = @sql + 'SUM(CantidadSolicitada) as CantidadCotizada,'
set @sql = @sql + 'CostoUnitario,'
set @sql = @sql + '0.00 as PorcDescuento,'
set @sql = @sql + '0.00 as Descuento,'
set @sql = @sql + ' (0) as IdIce,'
set @sql = @sql + ' (0) as PorcIce,'
set @sql = @sql + ' (0) as Ice,'
set @sql = @sql + ' (CantidadSolicitada*CostoUnitario)-(CantidadSolicitada*CostoUnitario*(SELECT SIGE_Inventario.dbo.Inv_F_getDescripIvaArticulo(IdEmpresa, IdItem))/100) as Total '
set @sql = @sql + ' FROM dbo.Cmp_DetalleRequerimiento'
set @sql = @sql + ' WHERE'
set @sql = @sql + ' dbo.Cmp_DetalleRequerimiento.IdEmpresa=' + convert(varchar(max),@VL_IdEmpresa) 
set @sql = @sql + ' and dbo.Cmp_DetalleRequerimiento.IdOficina =' + convert(varchar(max),@VL_IdOficina) 
set @sql = @sql + ' and dbo.Cmp_DetalleRequerimiento.IdBodega=' + convert(varchar(max),@VL_IdBodega) 
set @sql = @sql + ' and IdRequerimiento in (' + convert(varchar(max),@VL_Condicion) + ')'
set @sql = @sql + ' GROUP BY'
set @sql = @sql + ' IdRequerimiento,'
set @sql = @sql + ' IdDetRequerimiento,'
set @sql = @sql + ' IdEmpresa,'
set @sql = @sql + ' IdItem,'
set @sql = @sql + ' CostoUnitario,'
set @sql = @sql + ' CantidadSolicitada'
y luego pongo estas dos lineas:

Código:
print @sql
exec @sql
Y de resultado me da el error:

The name 'SELECT IdRequerimiento as Requerimiento, ... (todo lo demas) ... and dbo.Cmp_DetalleRequerimiento.IdBodeg' is not a valid identifier.

Al parecer mi sql se quedó trúncado ya que ese no es el final.

Y como le puse print tambien me muestra toda la sentencia sql que está ejecutando, copio dicha sentencia en el analizador de consultas y al ejecutarla no me da error

Ayudas!!!
  #2 (permalink)  
Antiguo 14/09/2006, 12:23
foo
 
Fecha de Ingreso: febrero-2006
Mensajes: 278
Antigüedad: 18 años, 7 meses
Puntos: 0
si no me equivoco tienes que ejecutar:

exec (@sql)
  #3 (permalink)  
Antiguo 14/09/2006, 14:21
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 4 meses
Puntos: 25
Sencillo, amplía la longitud de @sql

Por cierto... sql dinámico
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #4 (permalink)  
Antiguo 14/09/2006, 19:20
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años, 5 meses
Puntos: 47
Cita:
Iniciado por foo Ver Mensaje
si no me equivoco tienes que ejecutar:

exec (@sql)
´

Por Dios! despues de horas ya dí con la respuesta... le di mil vueltas al put... sql y efectivamente le faltaban los ( )

Cita:
Iniciado por Mithrandir Ver Mensaje
Sencillo, amplía la longitud de @sql

Por cierto... sql dinámico


No me quedaba otra, es que mi querido procedure recibe como parametro un xml el cual tengo que barrermelo y formar un string que me tocaba agregarlo en:

set @sql = @sql + ' and IdRequerimiento in (' + convert(varchar(max),@VL_Condicion) + ')'

vl_condicion contienen 1, 2, 5, 8 etc

cosa que es texto y no lo podía poner en la clausula in´ me daba error porque el campo IdRequerimiento es int, entonces me tocó formar toda la cadenota esa.

En la longitud el sql le puse max. No era ese el problema. A veces le damos vueltas a problemas tontos
  #5 (permalink)  
Antiguo 15/09/2006, 07:17
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 9 meses
Puntos: 38
con el string que pasas como parametro... se puede guardar en una variable tabla y seguir teniendo el in...
digo, si solo por eso tienes sql dinamico, facilmente se puede evitar...

un saludo
  #6 (permalink)  
Antiguo 15/09/2006, 13:33
Avatar de Mithrandir
Colaborador
 
Fecha de Ingreso: abril-2003
Mensajes: 12.106
Antigüedad: 21 años, 4 meses
Puntos: 25
EXEC (@sql) es una invitación para los sql injections. Por lo menos utiliza EXEC sp_executesql @sql que es cuando menos más eficiente y si mal no recuerdo mejora el tema de los injections. Revisa la ayuda del comando para que veas las diferencias.
__________________
"El hombre, en su orgullo, creó a Dios a su imagen y semejanza."
Friedrich Nietzsche
  #7 (permalink)  
Antiguo 15/09/2006, 14:36
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años, 5 meses
Puntos: 47
Ya la había revisado, como parámetros el procedure necesita los nombres de los parametros y el valor. La cosa es que mi procedimiento recibe algo como esto:

<?xml version="1.0" encoding="iso-8859-1"?>
<Usuario IdEmpresa="4" IdOficina="132" IdBodega="6">
<Requerimientos>
<Items IdRequerimiento="1" />
<Items IdRequerimiento="5" />
<Items IdRequerimiento="6" />
<Items IdRequerimiento="8" />
</Requerimientos>
</Usuario>

cosa que me barro el xml para obtener la cadena:

"1, 5, 6, 8"

que la guardo en el string @VL_Condicion, el cual lo añado en la linea:

Código:
set @sql = @sql + ' and IdRequerimiento in (' + convert(varchar(max),@VL_Condicion) + ')'
Se puede hacer de otra forma?
  #8 (permalink)  
Antiguo 15/09/2006, 14:51
Avatar de Andres95
Colaborador
 
Fecha de Ingreso: diciembre-2004
Mensajes: 1.802
Antigüedad: 19 años, 9 meses
Puntos: 38
si,

Declaras una variable tabla...
Código:
      Declare @MiTable Table(campo1 int)
luego cuando vayas obteniendo los Ids que concatenas en @VL_Condicion
en lugar de concatenar insertas en la variable tabla.

y listo.

quitas todas las concatenaciones de @sql

y en lugar de @VL_Condicion quedaria

and IdRequerimiento in (select campo1 from @mitabla)

como ves??
  #9 (permalink)  
Antiguo 15/09/2006, 15:05
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años, 5 meses
Puntos: 47
y en el select campo1 from @mitabla se recuperarán todos los valores... interesante. Gracias por enseñarme
  #10 (permalink)  
Antiguo 15/09/2006, 20:22
foo
 
Fecha de Ingreso: febrero-2006
Mensajes: 278
Antigüedad: 18 años, 7 meses
Puntos: 0
tambien podrias hacerlo directamente con los procedimientos y funciones para tratamiento de xml, revisa la documentacion
  #11 (permalink)  
Antiguo 16/09/2006, 13:33
Avatar de Developer9
(Desactivado)
 
Fecha de Ingreso: abril-2005
Ubicación: Mi Ecuador del alma
Mensajes: 4.196
Antigüedad: 19 años, 5 meses
Puntos: 47
eJE!!!!! lo que hice fue crear una tabla temporal y allí meter los datos del xml pa luego hacer el select en la clausa in y si funcionó. Gracias por la ide.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 19:10.