problemas adicionando columnas con el analizador de consultas

08/01/2004 - 00:56 por Avgvstvs | Informe spam
El problema es el siguiente estoy creando columnas en una tabla temporal
mediante la clausula:
alter table #tab_1 add col_1

y posteriormente ingreso valores a la columna, lo cual se ejecuta
correctamente, pero posteriormente en el mismo procedimiento almacenado
deseo llamar la columna directamente con el siguiente select:

select col_1 from #tab_1

y me reporta el siguiente error:

Servidor: mensaje 207, nivel 16, estado 3, procedimiento ProcPrueba,
línea 10
El nombre de columna 'col_1' no es válido.

pero cuando lo llamo mediante el select * from #tab_1 si me aparecen todas
las columnas de la tabla incluyendo col_1 correctamente.

El problema es que necesito asignar el valor de la columna en una variable y
la clausula select que utilizo para ello no la acepta el SQL con el error
descrito anteriormente.

Para mejor ilustración de mi caso pueden correr el siguiente código:

create procedure _prueba
as
select 'dato1', '1'
go

create table #AA (col_1 varchar(10))
alter table #AA add [col_2] varchar(10) null
insert into #AA execute _prueba
/*
Si se ejecuta la siguiente clausula select si funciona:
select * from #AA
*/

select col_2 from #AA
go

drop table #AA
drop procedure _prueba
go

Preguntas similare

Leer las respuestas

#21 Miguel Egea
08/01/2004 - 22:38 | Informe spam
Te equivocas, verás si la tabla es creada como local en el ambito actual,
está disponible hacia abajo (en los ambitos que abras después), y los
cambios, e inserciones que hagas en ellos tendrán visibilidad hacia arriba.
Te invito a que lo pruebes, creo sinceramente que con las globales tendrás
problemas.


=Miguel Egea
http://www.portalsql.com
Microsoft SQL-SERVER MVP.
Brigada Anti-Cursores
Aviso de Seguridad
http://www.microsoft.com/spain/tech...9-USER.asp
==
"Avgvstvs" escribió en el mensaje
news:
Miguel, no funciona si la temporal es local, me tocó utilizar una tabla
temporal global dentro del procedimiento almacenado, para que después de
crearla mediante la ejecución dinámica me quedara disponible para la
consulta.

AR

"Miguel Egea" escribió en el mensaje
news:
> bueno, no queda más que usar ejecuci`´on dinámia (no he leido todo el


ido
en
> detalle), pero así upede solventarse
> declare @cond int
> set @cond=1
> Create table #tabla(col_1 varchar(10))
> if @cond=1
> exec('Alter table #tabla add col_2 int')
> select * from #tabla
>
> Saludos
> Miguel Egea
> "Avgvstvs" escribió en el mensaje
> news:
> > Gracias, por la respuesta, pero tengo el problema que el código


expuesto
> lo
> > estoy corriendo dentro de un procedimiento almacenado y la instrucción
GO
> se
> > aplica para el alter procedure y no para el alter table. El problema


si
no
> > estoy mal es como si el sql no actualizara internamente la estructura


de
> la
> > tabla temporal después de la instrucción alter table, estoy en lo
> correcto?
> >
> > También probé mediante un condicional crear la tabla temporal con los
> campos
> > que necesito, como lo demuestra el siguiente código:
> >
> > declare @cond int
> > set @cond=1
> >
> > if @cond=1
> > create table #tabla (col_1 varchar(10), col_2 int)
> > else
> > create table #tabla (col_1 varchar(10))
> >
> > Pero al parecer el sql hace caso omiso de la estructura de


programación
y
> > muestra el siguiente error:
> > Ya hay un objeto con el nombre '#tabla' en la base de datos.
> >
> > Tienen alguna otra pista con la que me puedan ayudar?
> >
> >
> > "Adrian Garcia" escribió en el


mensaje
> > news:
> > > El problema se encuentra aqui:
> > >
> > > > create table #AA (col_1 varchar(10))
> > > > alter table #AA add [col_2] varchar(10) null
> > > > insert into #AA execute _prueba
> > >
> > > Tienes un CREATE TABLA seguido de un ALTER TABLE.
> > > Para que funcione correctamente debes hacer esto
> > >
> > > > create table #AA (col_1 varchar(10))
> > > > alter table #AA add [col_2] varchar(10) null
> > > GO
> > >
> > > > insert into #AA execute _prueba
> > >
> > > Insertar el comando GO despues del ALTER TABLE
> > >
> > > Saludos
> > >
> > > Adrian D. Garcia
> > > NDSoft
> > >
> > > "Avgvstvs" wrote in message
> > > news:
> > > > El problema es el siguiente estoy creando columnas en una tabla
> temporal
> > > > mediante la clausula:
> > > > alter table #tab_1 add col_1
> > > >
> > > > y posteriormente ingreso valores a la columna, lo cual se ejecuta
> > > > correctamente, pero posteriormente en el mismo procedimiento
> almacenado
> > > > deseo llamar la columna directamente con el siguiente select:
> > > >
> > > > select col_1 from #tab_1
> > > >
> > > > y me reporta el siguiente error:
> > > >
> > > > Servidor: mensaje 207, nivel 16, estado 3, procedimiento
> ProcPrueba,
> > > > línea 10
> > > > El nombre de columna 'col_1' no es válido.
> > > >
> > > > pero cuando lo llamo mediante el select * from #tab_1 si me


aparecen
> > todas
> > > > las columnas de la tabla incluyendo col_1 correctamente.
> > > >
> > > > El problema es que necesito asignar el valor de la columna en una
> > variable
> > > y
> > > > la clausula select que utilizo para ello no la acepta el SQL con


el
> > error
> > > > descrito anteriormente.
> > > >
> > > > Para mejor ilustración de mi caso pueden correr el siguiente


código:
> > > >
> > > > create procedure _prueba
> > > > as
> > > > select 'dato1', '1'
> > > > go
> > > >
> > > > create table #AA (col_1 varchar(10))
> > > > alter table #AA add [col_2] varchar(10) null
> > > > insert into #AA execute _prueba
> > > > /*
> > > > Si se ejecuta la siguiente clausula select si funciona:
> > > > select * from #AA
> > > > */
> > > >
> > > > select col_2 from #AA
> > > > go
> > > >
> > > > drop table #AA
> > > > drop procedure _prueba
> > > > go
> > > >
> > > >
> > >
> > >
> >
> >
>
>


Respuesta Responder a este mensaje
#22 Anonimo
08/01/2004 - 22:48 | Informe spam
Lo siento, me refería a hacerle el select into en lugar
del select actual del SP (desde fuera no puedes como
dices), de manera que el SP devuelva lo mismo que ahora,
pero con la tabla temporal ya creada...
SPActual: Select A from B...
SPcInto:
Set nocount on
Select A INTO #tabla from b
Select * from #tabla
go

Si alguien llama al SP desde cualquier aplicación no va a
notar cambio en la devolución, pero la diferencia en el
uso que le quieres dar vos es que ya te creó la tabla
temporal que estabas necesitando

2- Lo de las udf era pensando justamente en desmenuzar un
poco la lógica en lugar de sp muy largos y complicados. Si
en un punto necesito una tabla (no un select), yo trataría
de trasladar el código a una función que me devuelva una
tabla y no un sp que cree tablas temporales, etc. y muchas
veces terminan ejecutando sql dinámico.
Si el asp tiene 2 tablas posibles, yo llamaría a 2 sp
distintos que a su vez llamen a 2 funciones distintas. me
parece más fácil optimizarlas por separado que un sp
global que haga todo. lo mismo para mantenerlo.

Suerte
Manuel



¿Cuál es la sintaxis para hacer un select into si los


datos provienen de un
procedimiento almacenado?, intenté hacerlo y lo estuve


buscando en los BOL
pero nada encontré. Por eso opté por hacer la creación de


las tablas
selectivamente dependiendo del condicional.

Con respecto a las función definida por el usuario me


tocaría volver a
plasmar los procedimientos que tengo en funciones, ya


que las funciones no
permiten que internamente se ejecuten procedimientos


almacenados. Hacer esto
desde mi puto de vista sería ineficiente, ya que los


procedimientos
almacenados que tengo son cada uno largos y un poco


complejos.

Gracias

Augusto Romero Arango


"Manuel Etcheto"


escribió en el
mensaje news:0bff01c3d5f9$6426e730$
Buenas
disculpa, pero creo que podrías utilizar SELECT INTO para
despreocuparte de las columnas

O una UDF con un parámetro @condicion que te devuelva la
tabla que corresponda a la condición dada

Espero te sirva
Salu2
Manuel

Depenediendo de una condición la tabla debe llevar 2


campos o 5 campos.

El tamaño y órden de las columnas es escencial para mi


porque las tablas se
van a llenar mediante el select que devuelve un


procedimiento almacenado.

mi tabla inicial tiene 2 columnas, pero si la condición


hace que tenga que
usar el procedimiento almacenado que devuelve 5 campos


debo adicionarle las
columnas que me faltan para que las llene. Por eso


intenté hacer la creación
de la tabla selectiva mediante el condicional como lo


mostré en el ejemplo
del correo anterior, pero el SQL dice que la tabla ya


está creada, sin
verificar el condicional.

Gracias de antemano por estar pendiente de mi caso, y


espero haber podido
explicarme mejor.

Augusto Romero Arango

"Maximiliano Damian Accotto" <maxi_accotto[arroba]


speedy.com.ar.SACAME>
escribió en el mensaje news:O%



hmmmm, a ver lo que no entiendo es una cosa si me la




explicas:

Vos generas primero una tabla si? y luego le agregas




una columna? porque
haces esto y no directamente en la generacion de la




tabla poner todo?

Salu2

Maximiliano Damian Accotto


"Avgvstvs" escribió en el mensaje
news:
> Gracias, por la respuesta, pero tengo el problema que




el código expuesto
lo
> estoy corriendo dentro de un procedimiento almacenado




y la instrucción
GO
se
> aplica para el alter procedure y no para el alter




table. El problema si
no
> estoy mal es como si el sql no actualizara




internamente la estructura de
la
> tabla temporal después de la instrucción alter table,




estoy en lo
correcto?
>
> También probé mediante un condicional crear la tabla




temporal con los
campos
> que necesito, como lo demuestra el siguiente código:
>
> declare @cond int
> set @cond=1
>
> if @cond=1
> create table #tabla (col_1 varchar(10), col_2






int)
> else
> create table #tabla (col_1 varchar(10))
>
> Pero al parecer el sql hace caso omiso de la




estructura de programación
y
> muestra el siguiente error:
> Ya hay un objeto con el nombre '#tabla' en la




base de datos.
>
> Tienen alguna otra pista con la que me puedan ayudar?
> "Maximiliano Damian Accotto"





escribió
> en el mensaje




news:
> > hola, mira yo lo hice asi y me funciono a la




perfeccion.
> >
> > create table #pepe (col_1 varchar(10))
> > go
> > alter table #pepe add [col_2] varchar(10) null
> > go
> >
> > select [col_2] from #pepe
> > go
> >
> >
> > Salu2 enormes
> >






-
> > Maximiliano Damian Accotto
> >
> > Fundicion San Cayetano S.A.
> > Gerente de IT
> > Buenos Aires - Argentina
> >






-

> > Desarrollador 3 estrellas
> >





http://www.microsoft.com/spanish/ms...desarrolla


d
or/default.asp
> >






-

> > (maxi_accotto[arroba]speedy.com.ar)
> > MSN:
> > "Avgvstvs" escribió en el




mensaje
> > news:
> > > El problema es el siguiente estoy creando




columnas en una tabla
temporal
> > > mediante la clausula:
> > > alter table #tab_1 add col_1
> > >
> > > y posteriormente ingreso valores a la columna, lo




cual se ejecuta
> > > correctamente, pero posteriormente en el mismo




procedimiento
almacenado
> > > deseo llamar la columna directamente con el




siguiente select:
> > >
> > > select col_1 from #tab_1
> > >
> > > y me reporta el siguiente error:
> > >
> > > Servidor: mensaje 207, nivel 16, estado 3,




procedimiento
ProcPrueba,
> > > línea 10
> > > El nombre de columna 'col_1' no es válido.
> > >
> > > pero cuando lo llamo mediante el select * from




#tab_1 si me aparecen
> todas
> > > las columnas de la tabla incluyendo col_1




correctamente.
> > >
> > > El problema es que necesito asignar el valor de




la columna en una
> variable
> > y
> > > la clausula select que utilizo para ello no la




acepta el SQL con el
> error
> > > descrito anteriormente.
> > >
> > > Para mejor ilustración de mi caso pueden correr




el siguiente código:
> > >
> > > create procedure _prueba
> > > as
> > > select 'dato1', '1'
> > > go
> > >
> > > create table #AA (col_1 varchar(10))
> > > alter table #AA add [col_2] varchar(10) null
> > > insert into #AA execute _prueba
> > > /*
> > > Si se ejecuta la siguiente clausula select si




funciona:
> > > select * from #AA
> > > */
> > >
> > > select col_2 from #AA
> > > go
> > >
> > > drop table #AA
> > > drop procedure _prueba
> > > go
> > >
> > >
> >
> >
>
>






.





.

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