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

#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
Respuesta Responder a este mensaje
#2 Alejandro Mesa
24/10/2009 - 19:46 | Informe spam
Samuel,

Por lo que has posteado, no veo la necesidad de usar sql dinamico.

El error se debe a que el alcance de la variable es solo dentro de el
procedimiento. Como el sql dinamico se ejecuta en otro contexto, entonces no
se tiene acceso a esa variable tabla dentro de el nuevo contexto.

Por que no nos cuentas lo que tratas de hacer?

Quizas no sea necesario el uso de sql dinamico.


AMB


"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.
Gracias y saludos.

[ Samuel S.M.H. ]

Respuesta Responder a este mensaje
#3 Carlos M. Calvelo
24/10/2009 - 20:12 | Informe spam
Hola Alejandro,

On Sat, 24 Oct 2009 10:46:01 -0700, Alejandro Mesa wrote:

Samuel,

Por lo que has posteado, no veo la necesidad de usar sql dinamico.

El error se debe a que el alcance de la variable es solo dentro de el
procedimiento.



Aparte de que está tratando de concatenar una variable tipo tabla con una
cadena.

Como el sql dinamico se ejecuta en otro contexto, entonces no
se tiene acceso a esa variable tabla dentro de el nuevo contexto.

Por que no nos cuentas lo que tratas de hacer?

Quizas no sea necesario el uso de sql dinamico.




La misma impresión me ha dado a mi. Y hacer como en el ejemplo que le puse
yo no tiene sentido.

Saludos,
Carlos
Respuesta Responder a este mensaje
#4 Samuel
24/10/2009 - 22:11 | Informe spam
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


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

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.
y sino se puede, como segunda opcion seria concatenando(Pero tampoco me
deja).

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

Gracias de nuevo, por la ayuda.



"Alejandro Mesa" escribió en el
mensaje de noticias:
Samuel,

Por lo que has posteado, no veo la necesidad de usar sql dinamico.

El error se debe a que el alcance de la variable es solo dentro de el
procedimiento. Como el sql dinamico se ejecuta en otro contexto, entonces
no
se tiene acceso a esa variable tabla dentro de el nuevo contexto.

Por que no nos cuentas lo que tratas de hacer?

Quizas no sea necesario el uso de sql dinamico.


AMB


"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.
Gracias y saludos.

[ Samuel S.M.H. ]

Respuesta Responder a este mensaje
#5 Alejandro Mesa
25/10/2009 - 01:45 | Informe spam
Samuel,

Como comento Carlos, deberas usar una tabla temporal o permanente para que
se tenga acceso en el contexto donde se ejecuta el sql dinamico.

create table #t1 (c1 int);

insert into #t1 values(1);

exec('select c1 from #t1;')

drop table #t1;
go

Ahora, me parece mas practico que devuelvas todas las columnas hacia tu
aplicacion cliente y que sea en la aolicacion donde se decida que columnas
usar.

La otra opcion seria usar otro modelo, donde tengas una fila por cada mes.
Puedes usar el primer dia del mes para indicar el mes al corresponde la data.

Cual es la clave primaria de esa tabla?

AMB


"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


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

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.
y sino se puede, como segunda opcion seria concatenando(Pero tampoco me
deja).

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

Gracias de nuevo, por la ayuda.



"Alejandro Mesa" escribió en el
mensaje de noticias:
> Samuel,
>
> Por lo que has posteado, no veo la necesidad de usar sql dinamico.
>
> El error se debe a que el alcance de la variable es solo dentro de el
> procedimiento. Como el sql dinamico se ejecuta en otro contexto, entonces
> no
> se tiene acceso a esa variable tabla dentro de el nuevo contexto.
>
> Por que no nos cuentas lo que tratas de hacer?
>
> Quizas no sea necesario el uso de sql dinamico.
>
>
> AMB
>
>
> "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.
>> Gracias y saludos.
>>
>> [ Samuel S.M.H. ]
>>
Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida