error con exec

08/03/2007 - 21:12 por Aldo Salvado | Informe spam
Hola a todos, Sres alguien sabe porque cuando ejecuto lo siguiente

declare @sqla varchar(1000)

Set @sqla = 'Create Table #tRes([070101] varchar(30) ,[070102] varchar(30)
,[070103] varchar(30) ,[070104] varchar(30) )'

Exec @sqla

me indica el siguiente error :

Servidor: mensaje 203, nivel 16, estado 2, línea 4
El nombre 'Create Table #tRes([070101] varchar(30) ,[070102] varchar(30)
,[070103] varchar(30) ,[070104] varchar(30) )' no es un identificador
válido.


de antemano, muchas gracias.

Aldo.

Preguntas similare

Leer las respuestas

#6 Alejandro Mesa
09/03/2007 - 15:07 | Informe spam
Carlos,

El inverso no es igual. Cualquier tabla temporal local que se cree en el
procedimiento / batch principal puede ser vista por el procedimiento al que
se llama. Lo mismo pasa entre procedimientos almacenados, pero el inverso no
es igual. Si la tablas temporal local se crea en el procedimiento mas
interno, los externos no tendran acceso a ella porque tan pronto como este
termine su ejecucion, la tabla temporal desaparece.

- sp1 crea #t y llama a sp2, entonces sp2 tiene acceso a #t
- sp1 llama a sp2, sp2 crea #t entonces sp1 no tendra acceso a #t


AMB


"Carlos Sacristan" wrote:

Hola Alejandro,

eso es lo que yo tenía claro hasta que haciendo pruebas me encontré con
que si se crea una tabla temporal y luego se intenta acceder a ella mediante
EXEC(@sql), no falla. Ejemplo:

declare @sqla varchar(1000)

Set @sqla = 'Create Table #t(a INT) '

Exec (@sqla)


select * from #t

go

Create Table #t(a INT)


exec('select * from #t')

"Alejandro Mesa" escribió en el
mensaje news:
> Aldo Salvado,
>
> Con el permiso de Carlos.
>
>> Carlos, se supone que esto deberia crear la tabla ?, lo que sucede es que
>> hago un select a #tRes y no encuentra el objeto . .
>
> Mala suposicion. EXEC(string) y/o sp_exectesql se ejecutan en otro
> contexto,
> fuera del alcance del procedimineto que lo ejecuta, y por lo tanto
> cualquier
> tabla temporal local no sera vista por el procedimiento / batch que
> ejecuta
> la sentencia dinamicamente.
>
> Compartir datos entre procedimientos almacenados
> http://www.hayes.ch/sql/compartir_datos.html
>
>
> AMB
>
>
> "Aldo Salvado" wrote:
>
>> Carlos, se supone que esto deberia crear la tabla ?, lo que sucede es que
>> hago un select a #tRes y no encuentra el objeto . .
>>
>>
>> Gracias nuevamente.
>>
>> Aldo.
>>
>>
>>
>> "Carlos Sacristan" <nomail> escribió en el mensaje
>> news:
>> > Prueba
>> >
>> > declare @sqla varchar(1000)
>> > Set @sqla = 'Create Table #tRes([070101] varchar(30) ,[070102]
>> > varchar(30)
>> >
>> > ,[070103] varchar(30) ,[070104] varchar(30) )'
>> >
>> > Exec (@sqla)
>> >
>> > "Aldo Salvado" escribió en el mensaje
>> > news:
>> >> Hola a todos, Sres alguien sabe porque cuando ejecuto lo siguiente
>> >>
>> >> declare @sqla varchar(1000)
>> >>
>> >> Set @sqla = 'Create Table #tRes([070101] varchar(30) ,[070102]
>> >> varchar(30) ,[070103] varchar(30) ,[070104] varchar(30) )'
>> >>
>> >> Exec @sqla
>> >>
>> >> me indica el siguiente error :
>> >>
>> >> Servidor: mensaje 203, nivel 16, estado 2, línea 4
>> >> El nombre 'Create Table #tRes([070101] varchar(30) ,[070102]
>> >> varchar(30)
>> >> ,[070103] varchar(30) ,[070104] varchar(30) )' no es un identificador
>> >> válido.
>> >>
>> >>
>> >> de antemano, muchas gracias.
>> >>
>> >> Aldo.
>> >>
>> >>
>> >
>> >
>>
>>
>>



Respuesta Responder a este mensaje
#7 Carlos Sacristan
09/03/2007 - 18:06 | Informe spam
Sí, eso está claro. Lo que yo pensaba es que tanto EXEC(sql) como
sp_executesql eran un contexto de ejecución diferente, es decir, como si se
abriera una conexión y se ejecutara la sentencia. Por eso me extraña la
diferencia de comportamiento

"Alejandro Mesa" escribió en el
mensaje news:
Carlos,

El inverso no es igual. Cualquier tabla temporal local que se cree en el
procedimiento / batch principal puede ser vista por el procedimiento al
que
se llama. Lo mismo pasa entre procedimientos almacenados, pero el inverso
no
es igual. Si la tablas temporal local se crea en el procedimiento mas
interno, los externos no tendran acceso a ella porque tan pronto como este
termine su ejecucion, la tabla temporal desaparece.

- sp1 crea #t y llama a sp2, entonces sp2 tiene acceso a #t
- sp1 llama a sp2, sp2 crea #t entonces sp1 no tendra acceso a #t


AMB


"Carlos Sacristan" wrote:

Hola Alejandro,

eso es lo que yo tenía claro hasta que haciendo pruebas me encontré
con
que si se crea una tabla temporal y luego se intenta acceder a ella
mediante
EXEC(@sql), no falla. Ejemplo:

declare @sqla varchar(1000)

Set @sqla = 'Create Table #t(a INT) '

Exec (@sqla)


select * from #t

go

Create Table #t(a INT)


exec('select * from #t')

"Alejandro Mesa" escribió en el
mensaje news:
> Aldo Salvado,
>
> Con el permiso de Carlos.
>
>> Carlos, se supone que esto deberia crear la tabla ?, lo que sucede es
>> que
>> hago un select a #tRes y no encuentra el objeto . .
>
> Mala suposicion. EXEC(string) y/o sp_exectesql se ejecutan en otro
> contexto,
> fuera del alcance del procedimineto que lo ejecuta, y por lo tanto
> cualquier
> tabla temporal local no sera vista por el procedimiento / batch que
> ejecuta
> la sentencia dinamicamente.
>
> Compartir datos entre procedimientos almacenados
> http://www.hayes.ch/sql/compartir_datos.html
>
>
> AMB
>
>
> "Aldo Salvado" wrote:
>
>> Carlos, se supone que esto deberia crear la tabla ?, lo que sucede es
>> que
>> hago un select a #tRes y no encuentra el objeto . .
>>
>>
>> Gracias nuevamente.
>>
>> Aldo.
>>
>>
>>
>> "Carlos Sacristan" <nomail> escribió en el mensaje
>> news:
>> > Prueba
>> >
>> > declare @sqla varchar(1000)
>> > Set @sqla = 'Create Table #tRes([070101] varchar(30) ,[070102]
>> > varchar(30)
>> >
>> > ,[070103] varchar(30) ,[070104] varchar(30) )'
>> >
>> > Exec (@sqla)
>> >
>> > "Aldo Salvado" escribió en el mensaje
>> > news:
>> >> Hola a todos, Sres alguien sabe porque cuando ejecuto lo siguiente
>> >>
>> >> declare @sqla varchar(1000)
>> >>
>> >> Set @sqla = 'Create Table #tRes([070101] varchar(30) ,[070102]
>> >> varchar(30) ,[070103] varchar(30) ,[070104] varchar(30) )'
>> >>
>> >> Exec @sqla
>> >>
>> >> me indica el siguiente error :
>> >>
>> >> Servidor: mensaje 203, nivel 16, estado 2, línea 4
>> >> El nombre 'Create Table #tRes([070101] varchar(30) ,[070102]
>> >> varchar(30)
>> >> ,[070103] varchar(30) ,[070104] varchar(30) )' no es un
>> >> identificador
>> >> válido.
>> >>
>> >>
>> >> de antemano, muchas gracias.
>> >>
>> >> Aldo.
>> >>
>> >>
>> >
>> >
>>
>>
>>



email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida