Variable TABLA @Prueba

24/10/2009 - 18:20 por Samuel | Informe spam
Tengo un STORE todo bien definido y declarado sin errores, pero e visto la
necesidad de cambiarlo y ahora mi select se tendria que armar concatenando y
al final ejecutarlo con un EXEC();
Aqui viene el problema siguiente , me sale error al concatenar una VARIABLE
TABLA :

DECLARE @Evolucion TABLE(cdg_tab nchar(3),cdg_cli nchar(10),cdg_reg
nchar(1),fec_reg datetime, diasatraso int)

set @SQL = 'SELECT mt.sec_emp, evo.cdg_cli, evo.cdg_reg
FROM m_carteraevol mt
LEFT JOIN ( select * from '+ @Evolucion +' where
diasatraso>1) EVO
ON mt.cdg_tab = EVO.cdg_tab'
EXEC(@SQL)

MENSAJE DE ERROR: Must declare the scalar variable "@Evolucion".

- Si mi variable tabla @Evolucion ya esta declarada arriba; por que al
concatenar me aparece este error???.
Existe otra forma de hacerlo con variable tabla??, ya que no quiero cambiar
mi variable tabla por cursor ó # temporales.
Gracias y saludos.

[ Samuel S.M.H. ]

Preguntas similare

Leer las respuestas

#6 Carlos M. Calvelo
25/10/2009 - 02:24 | Informe spam
Hola Samuel,

On Sat, 24 Oct 2009 15:11:21 -0500, Samuel wrote:

Mostrar la cita
No sé lo que representa esa tabla con los meses, pero me dá la impresión de
que si fuera un mes por linea en vez de por columna no tendrías ahora
alguno de estos problemas que estás teniendo. Sería cuestión de filtrar los
meses deseados en el where.

Mostrar la cita
Claro. Es que con esas variables le estás dando valores a una columna, no
estás 'nombrando' la columna!
Piensa que para una columna 'normal' en el select, como evo.cdg_reg,
también estás diciendo que valores se deben tomar y por defecto la columna
resultado tendrá el mismo nombre que el de la columna en la tabla de donde
provienen. Pero el nombre es por defecto, no porque se haya especificado.
Vamos que 'evo.cdg_reg' es por defecto 'evo.cdg_reg as cdg_reg'.

Mostrar la cita
Vamos a ver. No estamos montando en la variable @SQL una cadena? Las
variables @Mescan_ant y @Mesimp_ant contienen cadenas pero @Evolucion no
contiene una cadena. Su valor es una tabla, no una cadena de carácteres.
No tiene sentido pegar una cadana a una tabla.

Mostrar la cita
Como tu estás exponiendo tu problema... eso no va a ser posible.

Mostrar la cita
Como ya he dicho lo que estás concatenando no tiene sentido. El valor en la
variable @Evolucion no es el nombre de una tabla, es la tabla misma.

Mostrar la cita
En vez de la variable @Evolucion de tipo tabla puedes usar una tabla
temporal, #Evolución. Pero seguirás necesitando sql dinámico para
determinar los nombres de las columnas.
Vendría a ser así:

set @SQL = 'SELECT mt.sec_emp, evo.cdg_cli, evo.cdg_reg,'+@Mescan_ant+'
,'+@Mesimp_ant+
'FROM m_carteraevol mt
LEFT JOIN ( select * from #Evolucion where
diasatraso>1) EVO ON mt.cdg_tab = EVO.cdg_tab'

EXEC(@SQL)

Cuando no necesites mas la tabla #Evolucion en el SP, ejecutas un 'drop
table #Evolucion' y ya está.

Saludos,
Carlos
#7 Samuel
26/10/2009 - 20:15 | Informe spam
Gracias por los aportes, si, en realidad no queria cambiar mis columnas de
meses por filas. ya que creceria en cada mes 24 veces y al año tambien,
la idea era mantener solo mis 24 reg. por cada año; mi clave principal seria
por el año (claro está que todo mi select no lo envié en la pregunta).
Aparte no solo creceria mi tabla, sino tambien mi select se haria mas
complejo y por lo tanto el servidor tendría que pensar mas en devolverme los
resultados.

Ok. gracias lo solucioné cambiando mi variable tabla por #temporal... lo
principal era salir de esta duda que si se podía o no ? usando Variable
tabla..
pero ya veo era mas complejo hacerlo,

solo me gustaria saber cual de las declaraciones es mas eficiente(consume
menor recurso memoria en el servidor), usar Temporales, cursores ó variable
Tabla ??

Saludos.

"Samuel" escribió en el mensaje de
noticias:
Mostrar la cita
Ads by Google
Search Busqueda sugerida