Aggiungere una nuova colonna della tabella di specifica posizione ordinale in Microsoft SQL Server

StackOverflow https://stackoverflow.com/questions/769828

Domanda

E 'possibile aggiungere una colonna a una tabella in una posizione ordinale specifica in Microsoft SQL Server?

Per esempio, i nostri tavoli hanno sempre createdOn, CreatedBy, LastModifiedOn, colonne LastModifiedBy alla "fine" di ogni definizione di tabella? Mi piacerebbe la nuova colonna di presentarsi in SSMS sopra queste colonne.

Se sto scripting tutte le mie modifiche al database, c'è un modo per conservare questo ordine alla fine del tavolo?

Cordiali saluti, non sto cercando di istituire una guerra di fiamma su se questo dovrebbe anche essere fatto. Se si desidera leggere su un filo che degenera rapidamente in questo, ecco una buona:

http://www.developersdex.com/sql/message. asp? p = 581 & r = 5.014.513

È stato utile?

Soluzione

È necessario creare una tabella temporanea che rispecchia lo schema della tabella originale ma con l'ordine colonna che si desidera, quindi copiare i contenuti dell'originale temp. Cancellare l'originale e rinominare la temperatura.

Questo è ciò che SQL Management Studio fa dietro le quinte.

Con uno strumento di sincronizzazione dello schema, è possibile generare automaticamente questi script.

Altri suggerimenti

andare in Studio la gestione di SQL Server, e "design" una tabella esistente. Inserire una colonna in mezzo, fare clic destro su un'area vuota e selezionare Genera Modifica Script ...

Ora guardate lo script che crea. esso sarà essenzialmente creare una tabella temporanea con l'ordine corretto colonna, inserire i dati dalla tabella originale, eliminare la tabella originale e rinominare la tabella temporanea. Questo è probabilmente ciò che è necessario fare.

 entrare descrizione dell'immagine qui

Potrebbe anche essere necessario deselezionare questa opzione per consentire la creazione di script di modifiche

 entrare descrizione dell'immagine qui

La risposta è sì, è tecnicamente possibile, ma si avrà un mal di testa farlo e ci vorrà molto tempo per eseguire e impostare.

Uno: Crea / Copia / goccia / Rinomina

Questo è in realtà quello di SQL Server sta facendo nell'interfaccia grafica: ecco un esempio dello script si sta generando e l'esecuzione quando si fa clic sul pulsante 'salva' dopo l'aggiunta di una nuova colonna per l'inizio di un tavolo.

/* To prevent any potential data loss issues, you should review this script in detail before running it outside the context of the database designer.*/
BEGIN TRANSACTION
SET QUOTED_IDENTIFIER ON
SET ARITHABORT ON
SET NUMERIC_ROUNDABORT OFF
SET CONCAT_NULL_YIELDS_NULL ON
SET ANSI_NULLS ON
SET ANSI_PADDING ON
SET ANSI_WARNINGS ON
COMMIT
BEGIN TRANSACTION
GO
CREATE TABLE dbo.Tmp_SomeTable
    (
    MyNewColumn int NOT NULL,
    OriginalIntColumn int NULL,
    OriginalVarcharColumn varchar(100) NULL
    )  ON [PRIMARY]
     TEXTIMAGE_ON [PRIMARY]
GO
ALTER TABLE dbo.Tmp_SomeTable SET (LOCK_ESCALATION = TABLE)
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable ON
GO
IF EXISTS(SELECT * FROM dbo.SomeTable)
     EXEC('INSERT INTO dbo.Tmp_SomeTable (OriginalIntColumn, OriginalVarcharColumn FROM dbo.SomeTable WITH (HOLDLOCK TABLOCKX)')
GO
SET IDENTITY_INSERT dbo.Tmp_SomeTable OFF
GO
DROP TABLE dbo.SomeTable
GO
EXECUTE sp_rename N'dbo.Tmp_SomeTable', N'SomeTable', 'OBJECT' 
GO

GO
COMMIT

Due: Aggiungi colonna / UPDATE / DROP COLONNA / RENAME

Questo metodo comporta fondamentalmente la creazione di una copia di tutte le colonne esistenti che si desidera aggiungere alla 'destra' della vostra nuova colonna, il trasferimento dei dati alla nuova colonna, quindi cadere gli originali e rinominare i nuovi. Ciò svolgere il caos con eventuali indici o vincoli che si possiede, poiché è necessario repoint loro. È tecnicamente possibile, ma di nuovo tempo sia in termini di sviluppo ed esecuzione.

CREATE TABLE MyTest (a int, b int, d int, e int)

INSERT INTO MyTest (a,b,d,e) VALUES(1,2,4,5)

SELECT * FROM MyTest -- your current table

ALTER TABLE MyTest ADD c int -- add a new column
ALTER TABLE MyTest ADD d_new int -- create copies of the existing columns you want to move
ALTER TABLE MyTest ADD e_new int

UPDATE MyTest SET d_new = d, e_new = e -- transfer data to the new columns

ALTER TABLE MyTest DROP COLUMN d -- remove the originals
ALTER TABLE MyTest DROP COLUMN e

EXEC SP_RENAME 'MyTest.d_new', 'd'; -- rename the new columns
EXEC SP_RENAME 'MyTest.e_new', 'e';

SELECT * FROM MyTest 

DROP TABLE MyTest -- clean up the sample

tre: Vivere con esso

Questo offende potentemente il mio senso di ordine ... ma a volte, semplicemente non vale la pena di rimpasto.

A mia conoscenza non esiste un metodo conosciuto per modificare l'ordine della colonna. Dietro le quinte SQL Management Studio fa quello che ha detto Jose Basilio. E se si dispone di un grande tavolo, allora non è pratico di cambiare gli ordini di colonne come questo senso.

È possibile utilizzare una "vista". Con una vista SQL è possibile utilizzare qualsiasi ordine che ti piace senza essere colpiti dai cambiamenti colonna della tabella.

TFS 2013 farà questo per voi automaticamente .

Aggiungere la nuova colonna (s) al vostro tavolo come vuoi, e poi i vostri cambiamenti al TFS. Da lì si può aprire il file sql della tabella in Visual Studio e spostare manualmente l'ordine delle colonne nel T-SQL CREATE script. Quindi è possibile aggiornare il database di destinazione utilizzando lo schema di VS strumento di confronto che si trova sotto Strumenti> SQL Server> Nuovo Schema di confronto. Scegli il tuo progetto di database con il cambiamento come la sorgente e il database da aggiornare come bersaglio. Confronto, selezionare lo script della tabella, e Update. VS scenderà e aggiungere automaticamente. Tutti i vostri dati saranno al sicuro, e gli indici anche.

Dirty e semplice.
tavolo Esporta in CSV.
Inserire nuovi dati nella posizione desiderata.
DROP TABLE.
Crea nuova tabella con le specifiche della colonna desiderata.
colonne di carico da csv per nuova tabella.

Quello che penso è semplice è quello di aggiungere la colonna ALTER TABLE table1 ADD .. e poi creare una tabella tmp come tmp_table1 dalla select come SELECT col1,col2,col5,col3,col4 into tmp_table1 from table1; e poi cadere table1 e rinominare il tmp_table1 a Table1 che è. Spero che aiutare qualcuno

Non sono sicuro se il filo è ancora attivo. Stavo facendo la stessa query con database MySQL. Proprio facendo clic sul tavolo e selezionando auto 'ALTER' generato il codice qui sotto. Esempio fornito da Sakila db e ha funzionato. Basta trovare la colonna dopo la quale si desidera inserire la nuova colonna e l'uso 'dopo' parola chiave

ALTER TABLE `sakila`.`actor` 
CHANGE COLUMN `middle_name` `middle_name` VARCHAR(50) NULL DEFAULT NULL AFTER `first_name`; 

selezionare tutta la colonna in tabella temporanea, e creare nuova tabella con la nuova colonna che si desidera  eliminare la vecchia tabella, selezionare tutto il colonna dalla tabella temporanea e inserire nuovi con la colonna di riordino. e senza dati persi

select * FROM TEMP
select * from originaltbl
select * from #Stagintbl 



declare @ColumnName nvarchar(max);
set @ColumnName=(select
   distinct  
    stuff((
        select ',' + a.COLUMN_NAME
        from (select Column_name from INFORMATION_SCHEMA.COLUMNS where TABLE_NAME='originaltbl') a

        for xml path('')
    ),1,1,'') as ColumnName)

declare @Sqlquery nvarchar(max)
set @Sqlquery='select '+@ColumnName+' from  #Stagintbl'+'';
Insert into originaltbl
Execute(@Sqlquery)
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top