|
|
||||||
|
#1
|
|
|
|
|
Saludos Compañeros,
Estoy trabajando un script para modificar varias tablas (como 25 o 30 tablas) de una base de datos como parte de un proyecto de migración. La mayor parte de los cambios consiste en crear un campo que se constituirá como el nuevo primary key. Para esto, por supuesto, voy a utilizar las bondades del ALTER TABLE. El único problema es que no encuentro documentación sobre cómo puedo añadir una columna y posicionarla antes que las demás. La razón es estética, pero también funcional, pues es más fácil para el equipo de trabajo localizar los PK cuando están trabajando en el desarrollo de la aplicación que se está planificando. ¿Es posible hacer esto? ¿Conoce alguien de un enlace que me pueda ayudar? Tengo sospechas de que se puede hacer, pues yo lo he hecho antes en MySQL con las cláusulas FIRST y BEFORE. Muchas gracias por la ayuda. C a r l o s A n t o n i o |
|
|
|
#2
|
|
|
|
|
Hola Carlos Antonio,
Hasta donde yo se no es posible mediante T-SQL modificar el orden de las columnas. Si tan importante es para ti el tener dicha columna en orden te recomiendo que crees una nueva la tabla con la nueva columna, hagas un volcado de los datos y luego borres la anterior y renombras la nueva. Si buscas por ahi igual encuentras algunos trucos para modificar el orden de la columna modificando tablas de sistema pero yo te recomendaría que fueses por esa vía bajo ningún concepto. Si con las "bondades" del ALTER TABLE lo que pretendías evitar era la lectura/escritura de los datos de la tabla... me temo que va a ser complicado no pasar por ese trámite. |
|
#3
|
|
|
|
|
Para cambiar el orden de las columnas hay que DROPear la tabla y volverla a
crear. Durante la beta de SQL Server 2005 fue una de las sugerencias que se pidió (una sintaxis en el ALTER TABLE para indicar la posición de una columna) pero no fué aceptada hasta donde conozco. En las tablas del sistema la posición de la columna se almacena mediante un valor entero, pero yo evitaría jugar con eso. |
|
#4
|
|
|
|
|
Hola, a nivel TSQL no existe eso y ademas no tiene mas que un sentido
estetico ya que tecnicamente es indistinto el orden de esas columnas. Es mas, este tipo de cambios desde el SSMS si los quiere aplicar lo que termina haciendo es un drop de la tabla y crear una temporal, muchos desarrolladores esto no lo conoce y dependiendo de la cantidad de registros y criticidad de la tabla se podia entrar en algun problema. Es mas aqui le dejo un link a una de las mejoras que han hecho en ssms 2008 para evitar que este tipo de cambios impacten sobre la performance. Pienselo bien, para que quiere las columnas en un orden? http://blog.maxiaccotto.com/post/200...o-de-2008.aspx |
|
#5
|
|
|
|
|
Tal y como bien dicen los demás, eso no es posible en SQL Server. Si lo
quieres hacer por temas de facilidades a los desarrolladores la única solución es la de recrear la tabla, con las implicaciones que ello tiene. Sin embargo, tal vez podrías generar esos nuevos campos que son PK con algún identificador que también ayude a los desarrolladores a localizarlos como pueda ser un prefijo o similar. |
|
#6
|
|
|
|
|
Muchas gracias por las respuestas de todos Tenía la sospecha de cuales
serían sus contestaciones pues mientras esperaba me dediqué a buscar en la internet sin encontrar nada. La razón para cambiar el orden de las columnas es sencilla: "El jefe lo pidió.". Aunque puede ser una tarea sin sentido, no cabe la duda que será interesante lograrlo máxime si me pagan por ello. Voy a seguir sus consejos y voy a DROPear y recrear las tablas a ver que tal resulta. Muchas gracias por su ayuda desinteresada y saludos, Carlos "Carlos Sacristan" <nomail> wrote in message news:1212 [..] |
|
#7
|
|
|
|
|
Hola, aqui te paso un ejemplo completo de TSQL para que te des una idea, en
el mismo puse el apellido luego del nombre BEGIN TRANSACTION GO CREATE TABLE dbo.Tmp_CLIENTES ( ID int NOT NULL, NOMBRE varchar(50) NULL, APELLIDO varchar(100) NULL, cuit nchar(10) NULL, DIRECCION nchar(10) NULL ) ON [PRIMARY] GO ALTER TABLE dbo.Tmp_CLIENTES SET (LOCK_ESCALATION = TABLE) GO IF EXISTS(SELECT * FROM dbo.CLIENTES) EXEC('INSERT INTO dbo.Tmp_CLIENTES (ID, NOMBRE, cuit, DIRECCION) SELECT ID, NOMBRE, cuit, DIRECCION FROM dbo.CLIENTES WITH (HOLDLOCK TABLOCKX)') GO DROP TABLE dbo.CLIENTES GO EXECUTE sp_rename N'dbo.Tmp_CLIENTES', N'CLIENTES', 'OBJECT' GO ALTER TABLE dbo.CLIENTES ADD CONSTRAINT PK_CLIENTES PRIMARY KEY CLUSTERED ( ID ) WITH( STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] GO COMMIT |
|
|
| Temas Similares | |
| alter table buenas, tengo una tabla con registros. y deseo agregar un campo que no admita nulo, entonces: a) Agrego Campo ALTER TABLE Tabla Add NuevoCampo char(1) b) Seteo valores... |
|
| Consulta Alter Table nombre Add columna(s) Hola a todos: Tengo una duda, sobre agregar varias columnas y la consulta que estoy realizando es: ALTER TABLE nombre_tabla ADD columna_1 (2,0) DEFAULT 1, ADD columna_2... |
|
| ALTER TABLE Hola, tengo el siguiente problema estoy ejecutando desde codigo el siguiente sql: s = "ALTER TABLE ARTICULOS ALTER COLUMN articulo TEXT(250);" base.Execute (s) para... |
|
| +++ ALTER TABLE +++ Alguien sabe como puedo insertar una columna en medio de otras que ya existen, todo desde el Query Analyzer ? Ejemp. EmpNum Nombre Direcc ----->> |
|
|
La franja horaria es GMT. Ahora son las 03:54. | Privacy Policy
|