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:

Hola y gracias por contestar:
bueno en primer lugar como verán en el mensaje e escrito una sentencia
select basica solo para no complicar las cosas y que me den respuesta de si
se puede? o no concatenar "variable tabla" .
pues ya me queda mas clara la cosa con sus respuestas.
entonces les pediria como hacer esto, ahi les va que necesito hacer:

tengo una tabla con campos de meses: Ene_imp, Feb_imp,Mar_imp ... hasta
Dic_imp

la idea es mediante SP. le envio parametro fecha '20091023' y que consulte
los datos del mes anterior y del mes actual.
continuando con el ejemplo, me tendria que obtener datos de las columnas :
Sep_imp, Oct_imp



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.



SET @Mesimp_ant = dbo.mesesp(convert(char(8), dateadd(mm,-1,'20091023'),
112)) + '_imp' -- esta funcion me obtiene el nombre del mes ANTERIOR y lo
concateno; queda asi ''Sep_imp''
SET @Mesimp_act = dbo.mesesp('20091023') + '_imp' --
esta funcion me obtiene el nombre del mes ACTUAL y lo concateno; queda asi
''Oct_imp''

***Aqui viene el PROBLEMA : si ejecuto
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

*** estas columnas @Mescan_ant ,@Mesimp_ant
el resultado me arroja con columnas sin nombre y contiene como dato
''Sep_imp" y ''Oct_imp'' En vez de mostrarme los valores de dichas
columnas.



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'.

por eso tuve que concatenar y usar :
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)
pero al concatenar me arroja ese error descrito antes.

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




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.


PD... no estoy poniendo todo el contenido de mi select.. ya que es grande,
pero con ese pequeño select es suficiente; la idea principal es de como
obtener los valores de esas variables al ejecutar mi select sin usar SQL
DINAMICO.



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

y sino se puede, como segunda opcion seria concatenando(Pero tampoco me
deja).



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.


Ojo. que todas las declaraciones estan correctas, por ahy no es el problema,
el problema es al ejecutar.




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
Respuesta Responder a este mensaje
#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:
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. ]
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida