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

Leer las respuestas

#1 Carlos M. Calvelo
24/10/2009 - 19:41 | Informe spam
Hola Samuel,

On Sat, 24 Oct 2009 11:20:16 -0500, Samuel wrote:

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.




Estas concatenando una cadena con la variable @Evolucion y esta no contiene
una cadena sino una tabla. Y en tu pregunta no se vé en ningún lado porque
tienes que usar SQL dinámico.

Por qué no haces simplemente asi:

SELECT mt.sec_emp, evo.cdg_cli, evo.cdg_reg
FROM m_carteraevol mt
LEFT JOIN @Evolucion EVO ON mt.cdg_tab = EVO.cdg_tab
WHERE EVO.diasatraso>1

?

Si insistes in utilizar variables tipo tabla en vez de tablas temporales
tendrás que declarar esas variables y asignarle algún valor en el mismo
contexto en el que se va a ejecutar la consulta; o sea, también el el sql
dinámico.

Por ejemplo:

declare @sql nvarchar(max)

set @sql = N'
declare @t1 table(id1 int, descr1 varchar(10));
declare @t2 table(id2 int, descr2 varchar(10));
insert into @t1 (id1,descr1)
select 1,''d1'' union select 2,''d2'';
insert into @t2 (id2,descr2)
select 2,''d2'' union select 3,''d3'';

select * from @t1;
select * from @t2;
select * from @t1 t1 join @t2 t2 on t1.id1=t2.id2;'

exec (@sql)


Saludos,
Carlos

Preguntas similares