POSICION DE COLUMNA

17/08/2005 - 00:27 por Mauricio | Informe spam
Buenas tardes grupo.

Quisiera saber si hay alguna manera de cambiar la posición de una columna de
una tabla sin tener que vaciar los datos a una tabla temporal, borrar la
tabla original, crearla con la nueva estructura y regresar los datos
nuevamente.

Muchas gracias por anticipado.

Mauricio

Preguntas similare

Leer las respuestas

#11 Mauricio
18/08/2005 - 00:30 | Informe spam
De hecho estoy actualizando ColId y ColOrder con el mismo número y hasta
ahora ha funcionado bien.

Si se de algo inadecuado se los haré saber.

Gracias... ;o)

"Alejandro Mesa" escribió en el
mensaje news:
Ese valor (ColOrder) no representa la posicion u orden de la columna en la
tabla (fijate que en los libros en linea dice que esta columna es para uso
interno), es el numero consecutivo que le toco a la columna a la hora de


ser
agregada a la tabla.

create table dbo.t1 (
c1 int,
c2 int,
c3 int,
c4 int,
c5 int
)
go

select
ordinal_position,
column_name
from
information_schema.columns
where
table_schema = 'dbo'
and table_name = 't1'
order by
ordinal_position
go

alter table dbo.t1
drop column c4
go

select
ordinal_position,
column_name
from
information_schema.columns
where
table_schema = 'dbo'
and table_name = 't1'
order by
ordinal_position
go

alter table dbo.t1
add c4 int
go

select
ordinal_position,
column_name
from
information_schema.columns
where
table_schema = 'dbo'
and table_name = 't1'
order by
ordinal_position
go

drop table dbo.t1
go

Como puedes ver, una vez que se elimino la columna c4, la columna c5


siguio
teniendo el mismo valor de ordinal_position, pero sin embargo en la tabla
solo quedan cuatro columnas. Cuando agregamos la columna c4 nuevamente,


esta
pasa a tener valor 6 en su ordinal_position (valor tomado de la columna
ColOrder en la tabla syscolumns) y sin embargo la tabla tiene solamente 5
columnas.

SQL Server mantiene unas cuantas tablas de sistema, usadas para su trbajo
interno, y muchas de las mismas estan relacionadas. Sabes tu si este valor
debe ser actualizado en otras tablas de sistema ademas de syscolumns?


AMB

"news.microsoft.com" wrote:

> Mauricio:
>
> Bueno, te paso los datos generales y vos despues hacete un


procedimiento
> almacenado que los utilice como mas te convenga.
>
> Lo primero que tenes que hacer es lo siguiente:
>
> Select ID from sysobjects where name = 'TABLA'
>
> En este caso TABLA es el nombre de la tabla de la cual vos queres
> obtener el orden de las columnas.
>
> A continuacion ejecutas con el ID recientemente averiguado el


siguiente
> select:
>
> Select Name, ColOrder from syscolumns where id= IDAVERIGUADO
>
> Donde IDAVERIGUADO es el ID previamente obtenido con el select sobre
> SYSOBJECTS.
>
> A partir de aca ya tenes el orden de cada campo de la tabla que


necesites
> en su correspondiente orden... solo resta hacer un update sobre esta


tabla
> para poner el orden que vos quieras a los campos...
>
> Espero que te sea util, y sobre todo espero tus comentarios...
>
> Saludos.
>
> Alvarez Arigós Roberto Miguel
> Analista Superior de Sistemas
> "Mauricio" escribió en el mensaje
> news:%23IAz%
> > Buenas tardes grupo.
> >
> > Quisiera saber si hay alguna manera de cambiar la posición de una


columna
> de
> > una tabla sin tener que vaciar los datos a una tabla temporal, borrar


la
> > tabla original, crearla con la nueva estructura y regresar los datos
> > nuevamente.
> >
> > Muchas gracias por anticipado.
> >
> > Mauricio
> >
> >
>
>
>
Respuesta Responder a este mensaje
#12 Alejandro Mesa
18/08/2005 - 22:48 | Informe spam
lo crea de nuevo por sentencia SQL es logico que se crea al final, ahora, si
luego con el administrador corporativo lo moves de lugar el colorder cambia.



La forma en que lo hace el EM es creando una tabla nueva, importando la data
desde la tabla en question, elimnando todo tipo de referencia a la tabla,
borrandola y por ultimo renombrando la tabla nueva y recreando indices y
referencias desde ella y hacia ella. Como puedes inmaginarte, cuando la tabla
en question contiene miles de filas, esta operacion tomara muchos recursos y
tiempo. He leido mensajes de otros que han cambiado la estructura de una
tabla usando EM y despues de varias horas han tenido que cancelar la accion.

Cualquier aplicacion que se base en la posicion ordinal de una columna, creo
que debe ser rediseñada. SQL Server es un sistema de base de datos
relacionales, no es un administrados de archivos secuenciales o cintas. No
existe una sola sentencia que haga uso de a posicion de la columna dentro de
la tabla.

Las tablas de sistema pueden cambiar de una version a otra y Microsoft no
esta obligado a dar informacion al respecto puesto que estas tablas son de
uso interno por parte de sql server, por lo que no es recomendable que se
usen en codigo de produccion. Si actualizas las tablas de sistema y algo
grave le pasa a la bd, no podras contar con ninguna ayuda de parte de
Microsoft.


Saludos,

AMB

"news.microsoft.com" wrote:

Alejandro:

Es totalmente Cierto lo que decis de que al eliminar un campo el valor de
ColOrder se pierde, tampoco me imagino al SQL server averiguando
internamente que campo borraste para asignar el numero que falta a la
columna añadida porque justamente perderia el orden de la columna y en tu
caso la columna añadida quedaria entre medio de las eliminadas, lo cual echa
por la borda el concepto de orden de este campo.

Sinceramente no se a que te referis con el "fijate que esa columna es para
uso interno", eso ya lo se, y el proposito segun mi logica porque no lo dice
ningun libro es mantener el orden en el que el usuario va creando las
columnas, este numero es autoincremental y cada vez que creas una columna
asigna un id nuevo en el campo COLORDER. Esto sirve perfectamente para lo
que quiere hacer Mauricio que es en base a un nombre de campo fijarse si
sigue estando en su orden correcto a la hora de hacer un insert o un update,
dado que no importa el momento en que consulte la tabla siempre le va a dar
el orden en que fueron creados los campos de la misma. Si borra un campo y
lo crea de nuevo por sentencia SQL es logico que se crea al final, ahora, si
luego con el administrador corporativo lo moves de lugar el colorder cambia.

En cuanto a tu pregunta, desconozco que haya otro lugar donde se informe
esto.

Espero me entiendas.

Saludos,

Roberto

"Alejandro Mesa" escribió en el
mensaje news:
> Ese valor (ColOrder) no representa la posicion u orden de la columna en la
> tabla (fijate que en los libros en linea dice que esta columna es para uso
> interno), es el numero consecutivo que le toco a la columna a la hora de
ser
> agregada a la tabla.
>
> create table dbo.t1 (
> c1 int,
> c2 int,
> c3 int,
> c4 int,
> c5 int
> )
> go
>
> select
> ordinal_position,
> column_name
> from
> information_schema.columns
> where
> table_schema = 'dbo'
> and table_name = 't1'
> order by
> ordinal_position
> go
>
> alter table dbo.t1
> drop column c4
> go
>
> select
> ordinal_position,
> column_name
> from
> information_schema.columns
> where
> table_schema = 'dbo'
> and table_name = 't1'
> order by
> ordinal_position
> go
>
> alter table dbo.t1
> add c4 int
> go
>
> select
> ordinal_position,
> column_name
> from
> information_schema.columns
> where
> table_schema = 'dbo'
> and table_name = 't1'
> order by
> ordinal_position
> go
>
> drop table dbo.t1
> go
>
> Como puedes ver, una vez que se elimino la columna c4, la columna c5
siguio
> teniendo el mismo valor de ordinal_position, pero sin embargo en la tabla
> solo quedan cuatro columnas. Cuando agregamos la columna c4 nuevamente,
esta
> pasa a tener valor 6 en su ordinal_position (valor tomado de la columna
> ColOrder en la tabla syscolumns) y sin embargo la tabla tiene solamente 5
> columnas.
>
> SQL Server mantiene unas cuantas tablas de sistema, usadas para su trbajo
> interno, y muchas de las mismas estan relacionadas. Sabes tu si este valor
> debe ser actualizado en otras tablas de sistema ademas de syscolumns?
>
>
> AMB
>
> "news.microsoft.com" wrote:
>
> > Mauricio:
> >
> > Bueno, te paso los datos generales y vos despues hacete un
procedimiento
> > almacenado que los utilice como mas te convenga.
> >
> > Lo primero que tenes que hacer es lo siguiente:
> >
> > Select ID from sysobjects where name = 'TABLA'
> >
> > En este caso TABLA es el nombre de la tabla de la cual vos queres
> > obtener el orden de las columnas.
> >
> > A continuacion ejecutas con el ID recientemente averiguado el
siguiente
> > select:
> >
> > Select Name, ColOrder from syscolumns where id= IDAVERIGUADO
> >
> > Donde IDAVERIGUADO es el ID previamente obtenido con el select sobre
> > SYSOBJECTS.
> >
> > A partir de aca ya tenes el orden de cada campo de la tabla que
necesites
> > en su correspondiente orden... solo resta hacer un update sobre esta
tabla
> > para poner el orden que vos quieras a los campos...
> >
> > Espero que te sea util, y sobre todo espero tus comentarios...
> >
> > Saludos.
> >
> > Alvarez Arigós Roberto Miguel
> > Analista Superior de Sistemas
> > "Mauricio" escribió en el mensaje
> > news:%23IAz%
> > > Buenas tardes grupo.
> > >
> > > Quisiera saber si hay alguna manera de cambiar la posición de una
columna
> > de
> > > una tabla sin tener que vaciar los datos a una tabla temporal, borrar
la
> > > tabla original, crearla con la nueva estructura y regresar los datos
> > > nuevamente.
> > >
> > > Muchas gracias por anticipado.
> > >
> > > Mauricio
> > >
> > >
> >
> >
> >



Respuesta Responder a este mensaje
#13 news.microsoft.com
18/08/2005 - 23:09 | Informe spam
Alejandro... "Estoy 100% de acuerdo con vos".. es mas, yo no uso esta
practica... simplemente le solucione el problema a Mauricio, no puedo
decirle como respuesta "hace toda tu aplicacion de nuevo"... me remito a
informarle como solucionar el problema concreto que tiene. Si su pregunta
hubiese comenzado con un "me recomiendan..." entonces le hubiese dicho que
no lo haga, pero a su problema concreto no tengo otra solucion alternativa
(dentro de SQL, ya que con programacion .net cambia la cosa pero desconozco
si el programa en este lenguaje).

Espero haber sido claro.

Saludos
Roberto

"Alejandro Mesa" escribió en el
mensaje news:
> lo crea de nuevo por sentencia SQL es logico que se crea al final,


ahora, si
> luego con el administrador corporativo lo moves de lugar el colorder


cambia.

La forma en que lo hace el EM es creando una tabla nueva, importando la


data
desde la tabla en question, elimnando todo tipo de referencia a la tabla,
borrandola y por ultimo renombrando la tabla nueva y recreando indices y
referencias desde ella y hacia ella. Como puedes inmaginarte, cuando la


tabla
en question contiene miles de filas, esta operacion tomara muchos recursos


y
tiempo. He leido mensajes de otros que han cambiado la estructura de una
tabla usando EM y despues de varias horas han tenido que cancelar la


accion.

Cualquier aplicacion que se base en la posicion ordinal de una columna,


creo
que debe ser rediseñada. SQL Server es un sistema de base de datos
relacionales, no es un administrados de archivos secuenciales o cintas. No
existe una sola sentencia que haga uso de a posicion de la columna dentro


de
la tabla.

Las tablas de sistema pueden cambiar de una version a otra y Microsoft no
esta obligado a dar informacion al respecto puesto que estas tablas son de
uso interno por parte de sql server, por lo que no es recomendable que se
usen en codigo de produccion. Si actualizas las tablas de sistema y algo
grave le pasa a la bd, no podras contar con ninguna ayuda de parte de
Microsoft.


Saludos,

AMB

"news.microsoft.com" wrote:

> Alejandro:
>
> Es totalmente Cierto lo que decis de que al eliminar un campo el


valor de
> ColOrder se pierde, tampoco me imagino al SQL server averiguando
> internamente que campo borraste para asignar el numero que falta a la
> columna añadida porque justamente perderia el orden de la columna y en


tu
> caso la columna añadida quedaria entre medio de las eliminadas, lo cual


echa
> por la borda el concepto de orden de este campo.
>
> Sinceramente no se a que te referis con el "fijate que esa columna es


para
> uso interno", eso ya lo se, y el proposito segun mi logica porque no lo


dice
> ningun libro es mantener el orden en el que el usuario va creando las
> columnas, este numero es autoincremental y cada vez que creas una


columna
> asigna un id nuevo en el campo COLORDER. Esto sirve perfectamente para


lo
> que quiere hacer Mauricio que es en base a un nombre de campo fijarse si
> sigue estando en su orden correcto a la hora de hacer un insert o un


update,
> dado que no importa el momento en que consulte la tabla siempre le va a


dar
> el orden en que fueron creados los campos de la misma. Si borra un campo


y
> lo crea de nuevo por sentencia SQL es logico que se crea al final,


ahora, si
> luego con el administrador corporativo lo moves de lugar el colorder


cambia.
>
> En cuanto a tu pregunta, desconozco que haya otro lugar donde se informe
> esto.
>
> Espero me entiendas.
>
> Saludos,
>
> Roberto
>
> "Alejandro Mesa" escribió en


el
> mensaje news:
> > Ese valor (ColOrder) no representa la posicion u orden de la columna


en la
> > tabla (fijate que en los libros en linea dice que esta columna es para


uso
> > interno), es el numero consecutivo que le toco a la columna a la hora


de
> ser
> > agregada a la tabla.
> >
> > create table dbo.t1 (
> > c1 int,
> > c2 int,
> > c3 int,
> > c4 int,
> > c5 int
> > )
> > go
> >
> > select
> > ordinal_position,
> > column_name
> > from
> > information_schema.columns
> > where
> > table_schema = 'dbo'
> > and table_name = 't1'
> > order by
> > ordinal_position
> > go
> >
> > alter table dbo.t1
> > drop column c4
> > go
> >
> > select
> > ordinal_position,
> > column_name
> > from
> > information_schema.columns
> > where
> > table_schema = 'dbo'
> > and table_name = 't1'
> > order by
> > ordinal_position
> > go
> >
> > alter table dbo.t1
> > add c4 int
> > go
> >
> > select
> > ordinal_position,
> > column_name
> > from
> > information_schema.columns
> > where
> > table_schema = 'dbo'
> > and table_name = 't1'
> > order by
> > ordinal_position
> > go
> >
> > drop table dbo.t1
> > go
> >
> > Como puedes ver, una vez que se elimino la columna c4, la columna c5
> siguio
> > teniendo el mismo valor de ordinal_position, pero sin embargo en la


tabla
> > solo quedan cuatro columnas. Cuando agregamos la columna c4


nuevamente,
> esta
> > pasa a tener valor 6 en su ordinal_position (valor tomado de la


columna
> > ColOrder en la tabla syscolumns) y sin embargo la tabla tiene


solamente 5
> > columnas.
> >
> > SQL Server mantiene unas cuantas tablas de sistema, usadas para su


trbajo
> > interno, y muchas de las mismas estan relacionadas. Sabes tu si este


valor
> > debe ser actualizado en otras tablas de sistema ademas de syscolumns?
> >
> >
> > AMB
> >
> > "news.microsoft.com" wrote:
> >
> > > Mauricio:
> > >
> > > Bueno, te paso los datos generales y vos despues hacete un
> procedimiento
> > > almacenado que los utilice como mas te convenga.
> > >
> > > Lo primero que tenes que hacer es lo siguiente:
> > >
> > > Select ID from sysobjects where name = 'TABLA'
> > >
> > > En este caso TABLA es el nombre de la tabla de la cual vos


queres
> > > obtener el orden de las columnas.
> > >
> > > A continuacion ejecutas con el ID recientemente averiguado el
> siguiente
> > > select:
> > >
> > > Select Name, ColOrder from syscolumns where id= IDAVERIGUADO
> > >
> > > Donde IDAVERIGUADO es el ID previamente obtenido con el select


sobre
> > > SYSOBJECTS.
> > >
> > > A partir de aca ya tenes el orden de cada campo de la tabla que
> necesites
> > > en su correspondiente orden... solo resta hacer un update sobre esta
> tabla
> > > para poner el orden que vos quieras a los campos...
> > >
> > > Espero que te sea util, y sobre todo espero tus comentarios...
> > >
> > > Saludos.
> > >
> > > Alvarez Arigós Roberto Miguel
> > > Analista Superior de Sistemas
> > > "Mauricio" escribió en el mensaje
> > > news:%23IAz%
> > > > Buenas tardes grupo.
> > > >
> > > > Quisiera saber si hay alguna manera de cambiar la posición de una
> columna
> > > de
> > > > una tabla sin tener que vaciar los datos a una tabla temporal,


borrar
> la
> > > > tabla original, crearla con la nueva estructura y regresar los


datos
> > > > nuevamente.
> > > >
> > > > Muchas gracias por anticipado.
> > > >
> > > > Mauricio
> > > >
> > > >
> > >
> > >
> > >
>
>
>
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida