Come rinominare una tabella in SQL Server?


370

La SQLquery che ho usato è:

ALTER TABLE oldtable RENAME TO newtable;

Ma mi dà un errore.

Server: messaggio 156, livello 15, stato 1, riga 1
Sintassi errata vicino alla parola chiave "TO".

Risposte:


683

Per rinominare una tabella in SQL Server, utilizzare il sp_renamecomando:

exec sp_rename 'schema.old_table_name', 'new_table_name'

7
Ancora una cosa: se uno dei nomi di tabella ha un .in loro, utilizzare []intorno al nome della tabella. (Lo so, lo so, ma i punti possono accadere ...) Ad esempio sp_rename '[Stupid.name]', 'NewName'o con schemasp_rename '[dbo.Stupid.name]', 'NewName'
vacip

55
E per aggiungere, non mettere accidentalmente lo schema nel 'NewName'campo, altrimenti la tua tabella potrebbe finire per assomigliare a qualcosa del genere dbo.dbo.NewName.
Michael Plautz,

4
Tieni presente che quando rinomini una tabella, quasi sicuramente desideri anche rinominare qualsiasi riferimento a quella tabella che potrebbe esistere in stored procedure, viste, funzioni, ecc. Un rapido google può trovare uno dei tanti strumenti che possono farlo per te . Oppure puoi usare uno script che trova una determinata stringa in tutti questi oggetti e incollarli come istruzioni ALTER, fare una ricerca e sostituire, quindi eseguirli tutti.
MGOwen,

2
Puoi anche creare un sinonimo che prende il nome dal vecchio nome della tabella che punta alla nuova tabellaCREATE SYNONYM [schema].[synonymName] FOR [schema].[tableName]
Ruskin,

non inserire il nuovo nome tra parentesi quadre! altrimenti la tabella avrà parentesi quadre NEL nome. Quindi: 'new_table_name' - è corretto, '[new_table_name]' - ti metterà nei guai
VeganHunter


14

Quando usi sp_rename che funziona come nelle risposte sopra, controlla anche quali oggetti sono interessati dopo la ridenominazione, quel riferimento a quella tabella, perché devi cambiare anche quelli

Ho preso un esempio di codice per le dipendenze delle tabelle sul blog di Pinal Dave qui

USE AdventureWorks
GO
SELECT
referencing_schema_name = SCHEMA_NAME(o.SCHEMA_ID),
referencing_object_name = o.name,
referencing_object_type_desc = o.type_desc,
referenced_schema_name,
referenced_object_name = referenced_entity_name,
referenced_object_type_desc = o1.type_desc,
referenced_server_name, referenced_database_name
--,sed.* -- Uncomment for all the columns
FROM
sys.sql_expression_dependencies sed
INNER JOIN
sys.objects o ON sed.referencing_id = o.[object_id]
LEFT OUTER JOIN
sys.objects o1 ON sed.referenced_id = o1.[object_id]
WHERE
referenced_entity_name = 'Customer'

Quindi, anche tutti questi oggetti dipendenti devono essere aggiornati

Oppure, se possibile, usa alcuni componenti aggiuntivi, alcuni di essi hanno la funzione di rinominare gli oggetti e tutti dipendono anche da oggetti


11

Se si tenta di exec sp_renamericevere un errore LockMatchID, potrebbe essere utile aggiungere prima un'istruzione use [database]:

Provai

 exec sp_rename '[database_name].[dbo].[table_name]', 'new_table_name';
 -- Invalid EXECUTE statement using object "Object", method "LockMatchID".

Quello che dovevo fare per risolverlo era riscriverlo in:

use database_name
exec sp_rename '[dbo].[table_name]', 'new_table_name';

10

Nome tabella

sp_rename 'db_name.old_table_name', 'new_table_name'

Colonna

sp_rename 'db_name.old_table_name.name' 'userName', 'COLUMN'

Indice

sp_rename 'db_name.old_table_name.id', 'product_ID', 'INDEX'

disponibile anche per statica e tipi di dati


2
Per la colonna ti manca una virgola tra il primo e il secondo parametro. Dovrebbe essere: sp_rename 'db_name.old_table_name.name', 'userName', 'COLUMN'
sebastian.roibu


0

Nulla ha funzionato da qui proposto .. Quindi ho appena analizzato i dati in una nuova tabella

SELECT * 
INTO [acecodetable].['PSCLineReason']
FROM [acecodetable].['15_PSCLineReason'];

forse sarà utile per qualcuno ..

Nel mio caso non ha riconosciuto il nuovo schema, anche il dbo era il proprietario.

AGGIORNARE

EXECUTE sp_rename N'[acecodetable].[''TradeAgreementClaim'']', N'TradeAgreementClaim';

Ha funzionato per me. L'ho trovato dallo script generato automaticamente durante l'aggiornamento del PK per una delle tabelle. In questo modo ha riconosciuto anche il nuovo schema.


0

Per modificare il nome di una tabella con uno schema diverso:

Esempio: modificare dbo.MyTable1 in wrk.MyTable2

EXEC SP_RENAME 'dbo.MyTable1', 'MyTable2'

ALTER SCHEMA wrk TRANSFER dbo.MyTable2
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.