Rinomina colonna SQL Server 2008


653

Sto usando SQL Server 2008 e Navicat. Devo rinominare una colonna in una tabella usando SQL.

ALTER TABLE table_name RENAME COLUMN old_name to new_name;

Questa affermazione non funziona.



5
Si noti che questo non è esattamente un duplicato della domanda n. 174582 che swetha ha collegato: questo è specifico per MS SQL, che è indipendente dal database.

Risposte:


1195

Uso sp_rename

EXEC sp_RENAME 'TableName.OldColumnName' , 'NewColumnName', 'COLUMN'

Vedere: SERVER SQL - Come rinominare un nome colonna o un nome tabella

Documentazione: sp_rename (Transact-SQL)

Per il tuo caso sarebbe:

EXEC sp_RENAME 'table_name.old_name', 'new_name', 'COLUMN'

Ricorda di utilizzare virgolette singole per racchiudere i tuoi valori.


24
Si noti che non è necessario inserire NewColumnName tra parentesi, poiché SQL Server utilizzerà quindi [[[NewColumnName]]] come nome della nuova colonna. Inoltre, sp_rename deve essere preceduto da EXEC o EXECUTE.
Mark Freeman,

29
È consentito e incoraggiato a inserire parentesi nel primo parametro, identificando la colonna, ma non nel secondo parametro. In questo modo:EXEC sp_RENAME '[TableName].[OldColumnName]', 'NewColumnName', 'COLUMN'
Niels Brinch

2
Si dovrebbe notare nella sua risposta che questa procedura memorizzati i valori di default le maniglie, ecc nulli contraints mentre si fa la ridenominazione, al contrario di una pianura alter tableche fallirà se esistono tali vincoli.
Tuncay Göncüoğlu,

4
Nota che se usi "table_name.new_name", diventa [schema]. [Table_name]. [Table_name.new_name] - quindi non inserire quel nome tabella nel nuovo nome! (è corretto in questa risposta, basta aggiungere una nota per i pigoli)
Mark Schultheiss,

1
Se c'è uno schema nel database bisogna mettere il nome schema prima nome della tabella: EXEC sp_rename 'schema_name.table_name.old_name', 'new_name', 'colonna'
Amin

106

In alternativa SQL, è possibile farlo in Microsoft SQL Server Management Studio. Ecco alcuni modi rapidi per utilizzare la GUI:

Primo modo

Fai doppio clic lento sulla colonna. Il nome della colonna diventerà una casella di testo modificabile.


Secondo modo

Fai clic con il tasto destro sulla colonna e scegli Rinomina dal menu contestuale.

Per esempio:

Per rinominare il nome della colonna


Terza via

In questo modo è preferibile quando è necessario rinominare più colonne in una volta sola.

  1. Fare clic con il tasto destro del mouse sulla tabella che contiene la colonna che deve essere rinominata.
  2. Fai clic su Design .
  3. Nel pannello di progettazione della tabella, fai clic e modifica la casella di testo del nome della colonna che desideri modificare.

Per esempio: Esempio di progettazione della tabella MSSMS

NOTA: so che l'OP ha chiesto espressamente una soluzione SQL, pensavo che questo potesse aiutare gli altri :)


1
Oppure l'utente non ha i privilegi.
Carrie Kendall,

6
Mai e poi mai. Stai copiando il tavolo, quindi rilasciando il vecchio e rinominandolo. Non utilizzare MAI la GUI MAI per modificare nulla di una tabella.
HLGEM,

6
@HLGEM è un'affermazione generale piuttosto grande. In ogni caso, puoi fornire risorse a ciò che hai spiegato? cioè cadere il tavolo, ecc.
Carrie Kendall,

2
@CarrieKendall, elimina la modifica dalla GUI invece di apportarla e vedrai. Questo è il motivo per cui è molto più lento apportare una modifica utilizzando la GUI in una tabella di grandi dimensioni rispetto all'utilizzo di sp_rename o alter table. Inoltre, le modifiche alla struttura del database sono modifiche al codice e dovrebbero essere nel controllo del codice sorgente come altri codici, quindi dovrebbero essere in uno script. Ciò è particolarmente importante se non si consente ai diritti del database di produzione di sviluppo di modificare le tabelle in quanto è necessario lo script in ogni caso. E non vuoi andare in giro a copiare, eliminare e ricreare tabelle con milioni di record su prod.
HLGEM,

18
Ho appena rinominato una tabella di SQL Server 2012 utilizzando Management Studio con il profiler in esecuzione e ha utilizzato sp_rename. Non posso parlare per le versioni precedenti però.
Steve Dowling,

58

Provare:

EXEC sp_rename 'TableName.OldName', 'NewName', 'COLUMN'

27

Dovresti anche specificare lo schema della tabella o potresti ricevere questo errore:

Messaggio 15248, livello 11, stato 1, procedura sp_rename, riga 238 Il parametro @objname è ambiguo o il @objtype richiesto (COLUMN) è errato.

Se si tratta di uno script di distribuzione, consiglierei anche di aggiungere ulteriore sicurezza ad esso.

IF EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'OldColumnName' AND
            object_name(object_id) = 'TableName'
    ) AND
    NOT EXISTS (
        SELECT 1
        FROM sys.columns
        WHERE
            name = 'NewColumnName' AND
            object_name(object_id) = 'TableName'
    )
    EXEC sp_RENAME 'SchemaName.TableName.OldColumnName', 'NewColumnName', 'COLUMN';

Mi piace questo approccio sicuro, ottimo per scrivere migrazioni che potrebbero / potrebbero non essere eseguite su ambienti diversi.
Adil H. Raza,

come il controllo dell'esistenza, mi fa sentire bene rileggere come parte di una serie di altri script
sconosciuto

19

Sarebbe un buon suggerimento usare una funzione già integrata ma un altro modo per aggirare è:

  1. Crea una nuova colonna con lo stesso tipo di dati e NUOVO NOME.
  2. Esegui un'istruzione UPDATE / INSERT per copiare tutti i dati in una nuova colonna.
  3. Rilascia la vecchia colonna.

Il vantaggio dietro l'utilizzo di sp_renameè che si prende cura di tutte le relazioni ad esso associate.

Dalla documentazione :

sp_rename rinomina automaticamente l'indice associato ogni volta che viene rinominato un vincolo PRIMARY KEY o UNIQUE. Se un indice rinominato è legato a un vincolo PRIMARY KEY, anche il vincolo PRIMARY KEY viene automaticamente rinominato da sp_rename. sp_rename può essere utilizzato per rinominare gli indici XML primari e secondari.


* Nel passaggio 1 NULL deve essere consentito nella nuova colonna * Facoltativamente aggiungere il quarto passaggio per modificare la nuova colonna, che non consente i valori NULL
BitLauncher

16

Puoi usare sp_renameper rinominare una colonna.

USE YourDatabase;  
GO  
EXEC sp_rename 'TableName.OldColumnName', 'NewColumnName', 'COLUMN';  
GO  

Il primo parametro è l'oggetto da modificare, il secondo parametro è il nuovo nome che verrà assegnato all'oggetto e il terzo parametro COLUMN informa il server che la ridenominazione è per il column, e può anche essere usato per rinominare tables, indexe alias data type.


2
Non capisco, perché aggiungi una nuova risposta anche sopra la menzione 4 su 5 su sp_rename ...?
Pawel Czapski,

3
Ad un certo punto qualcuno avrebbe dovuto spiegare qui il funzionamento del parametro, nessuno lo ha fatto
Alexandre Neukirchen,

1
Sì, in realtà hai ragione, per me è così ovvio, ma per i nuovi ragazzi potrebbe non esserlo.
Pawel Czapski,

12

Dato che vengo spesso qui e poi mi chiedo come usare le parentesi, questa risposta potrebbe essere utile per quelli come me.

EXEC sp_rename '[DB].[dbo].[Tablename].OldColumnName', 'NewColumnName', 'COLUMN'; 
  • Il OldColumnNamenon deve essere dentro []. Non funzionerà.
  • Non mettere NewColumnNamein [], il risultato sarà in [[NewColumnName]].

3

Sql Server management studio ha alcuni Stored Procedure (SP) definiti dal sistema
Uno dei quali viene utilizzato per rinominare una colonna. SP è sp_rename

Sintassi: sp_rename '[table_name] .old_column_name', 'new_column_name'
Per ulteriori informazioni, consultare questo articolo: sp_rename di Microsoft Docs

Nota: Al momento dell'esecuzione di questo SP, il server sql fornirà un messaggio di avvertenza come " Attenzione: la modifica di qualsiasi parte del nome di un oggetto potrebbe interrompere script e procedure memorizzate ". Questo è fondamentale solo se hai scritto il tuo sp che coinvolge la colonna nella tabella che stai per cambiare.


2

Versione migliorata di @Taher

DECLARE @SchemaName AS VARCHAR(128)
DECLARE @TableName AS VARCHAR(128)
DECLARE @OldColumnName AS VARCHAR(128)
DECLARE @NewColumnName AS VARCHAR(128)
DECLARE @ParamValue AS VARCHAR(1000)

SET @SchemaName = 'dbo'
SET @TableName = 'tableName'
SET @OldColumnName = 'OldColumnName'
SET @NewColumnName = 'NewColumnName'
SET @ParamValue = @SchemaName + '.' + @TableName + '.' + @OldColumnName

IF EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @OldColumnName AND OBJECT_NAME(object_id) = @TableName
)
AND NOT EXISTS
(
    SELECT 1 FROM sys.columns WHERE name = @NewColumnName AND OBJECT_NAME(object_id) = @TableName
)
BEGIN
    EXEC sp_rename @ParamValue, @NewColumnName, 'COLUMN';
END

0

Oppure puoi semplicemente fare doppio clic lento sulla colonna in SQL Management Studio e rinominarlo tramite l'interfaccia utente ...


-1

Esegui query:

    SP_RENAME '[TableName].[ColumnName]','NewNameForColumn'

Si prega di non ripetere le risposte di vecchia data ed esistenti con molti voti positivi.
TT.
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.