2009-04-20 16 views
28

È possibile aggiungere una colonna a una tabella in una posizione ordinale specifica in SQL Server?Aggiungere una nuova colonna di tabella alla posizione ordinale specifica

Ad esempio, le nostre tabelle hanno sempre colonne CreateedOn, CreatedBy, LastModifiedOn, LastModifiedBy alla "fine" di ogni definizione di tabella? Mi piacerebbe che la nuova colonna si visualizzasse in SSMS sopra queste colonne.

Se eseguo lo scripting di tutte le modifiche del database, esiste un modo per mantenere questo ordine alla fine della tabella?

FYI, non sto cercando di creare una guerra di fuoco se questo dovrebbe 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=5014513

+0

O è questa la ragione per cui dovrei creare viste sopra ogni tabella? –

+0

Correlati: http://stackoverflow.com/q/1605144/12484 –

risposta

23

è necessario creare una tabella temporanea che rispecchia lo schema della tabella originale ma con l'ordine colonna che si desidera, quindi copiare il contenuto dell'originale in temp. Elimina l'originale e rinomina la temp.

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

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

+0

Le tabelle temporanee non possono essere rinominate al di fuori di 'tempdb'. –

3

accedere a SQL Server management Studio e "progettare" una tabella esistente. Inserisci una colonna nel mezzo e osserva lo script che crea. creerà fondamentalmente una tabella temporanea con l'ordine di colonne corretto, inserirà i dati dalla tabella originale, eliminerà la tabella originale e rinomina la tabella temporanea. Questo è probabilmente quello che devi fare.

3

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

È possibile utilizzare una "vista". Con le viste SQL puoi utilizzare qualsiasi ordine che ti piace senza essere influenzato dalle modifiche alla colonna della tabella.

0

Non è possibile creare una colonna in una specifica posizione ordinale nella struttura della tabella, inoltre, perché si desidera? L'ordine delle colonne in SQL Server è totalmente irrilevante.

SQL Server Management Studio ha una vista di progettazione che consente apparentemente di creare una colonna in qualsiasi posizione nell'elenco di colonne, ma ciò che realmente accade qui sullo sfondo è che la nuova tabella con le nuove colonne viene creata e la il vecchio viene lasciato cadere.

Non ci sono comandi SQL DDL per creare una colonna in una posizione specifica o per "riordinare" le colonne. Non è davvero necessario.

Marc

+4

Perché vorresti? In modo che sia più semplice visualizzare le cose in SSMS. Se, per esempio, ho una tabella che consiste in un insieme di timestamp che un prodotto procede attraverso la fabbrica, il fatto di averli naturalmente in sequenza nel database aiuta a leggere i dati piuttosto che saltare avanti e indietro molto. Sì, non ha importanza nel codice, ma aiuta a ridurre il carico cognitivo durante il tentativo di eseguire il debug delle cose. –

+0

@Colin Mackay: Sì, ecco a cosa servono le opinioni. Non dimenticare di rilasciare dopo il debug. –

7

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

Uno: Creare/Copia/goccia/Rinomina

Questo è in realtà ciò che SQL Server sta facendo nell'interfaccia grafica: ecco un esempio dello script si sta generando e l'esecuzione quando si fa clic su 'Salva' pulsante dopo aver aggiunto una nuova colonna all'inizio di una tabella.

/* 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 sostanzialmente prevede la creazione di una copia di tutte le colonne esistenti che si desidera aggiungere alla 'destra' della vostra nuova colonna, trasferendo i dati nella nuova colonna, quindi rilasciando gli originali e rinominando i nuovi. Ciò causerà il caos con qualsiasi indice o vincolo che hai, dal momento che devi reimpostarli. È tecnicamente possibile, ma richiede sempre molto tempo 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: convivere con essa

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

0

TFS 2013 lo farà automaticamente per voi.

Aggiungere le nuove colonne al proprio tavolo in qualsiasi modo e quindi confermare le modifiche a TFS. Da lì è possibile aprire il file sql della tabella in Visual Studio e spostare manualmente l'ordine delle colonne nello script CREATE T-SQL. Quindi è possibile aggiornare il database di destinazione utilizzando lo strumento di confronto degli schemi di VS disponibile in Strumenti> SQL Server> Nuovo confronto degli schemi. Scegli il tuo progetto di database con le modifiche come origine e il database che desideri aggiornare come destinazione. Confronta, seleziona lo script della tabella e Aggiorna. VS cadrà e aggiungerà automaticamente. Tutti i tuoi dati saranno al sicuro e anche gli indici.

0

Sporco e semplice.
Esporta tabella in csv.
Inserire i nuovi dati nella posizione desiderata.
Tabella di rilascio.
Creare una nuova tabella con le specifiche della colonna desiderata.
Carica colonne da csv a nuova tabella.

Problemi correlati