DROP TABLE (Transact-SQL)

Rimuove una o più definizioni di tabella e tutti i dati, gli indici, i trigger, i vincoli e le specifiche di autorizzazione associate alle tabelle in questione. Le viste e stored procedure che fanno riferimento alla tabella eliminata devono essere eliminate in modo esplicito tramite l'istruzione DROP VIEW o DROP PROCEDURE. Per segnalare le dipendenze su una tabella, utilizzare sys.dm_sql_referencing_entities.

Sintassi

DROP TABLE [ database_name . [ schema_name ] . | schema_name . ]
        table_name [ ,...n ] [ ; ]

Argomenti

  • database_name
    Nome del database in cui è stata creata la tabella.

  • schema_name
    Nome dello schema a cui appartiene la tabella.

  • table_name
    Nome della tabella da rimuovere.

Osservazioni

Non è possibile utilizzare l'istruzione DROP TABLE per eliminare una tabella a cui fa riferimento un vincolo FOREIGN KEY. È prima necessario eliminare il vincolo FOREIGN KEY o la tabella di riferimento. Se con la stessa istruzione DROP TABLE si eliminano sia la tabella di riferimento che la tabella che contiene la chiave primaria, è necessario indicare la tabella di riferimento per prima nell'elenco.

Si possono eliminare più tabelle in qualsiasi database. Se una tabella da eliminare fa riferimento alla chiave primaria di un'altra tabella, anch'essa da eliminare, è necessario indicare la tabella di riferimento con la chiave esterna prima della tabella contenente la chiave primaria a cui fa riferimento la prima tabella.

Con l'eliminazione di una tabella, le regole o i valori predefiniti della tabella vengono disassociati e i vincoli o trigger associati alla tabella vengono eliminati automaticamente. Se la tabella viene ricreata, è necessario associare nuovamente le regole e i valori predefiniti appropriati, ricreare eventuali trigger e aggiungere tutti i vincoli necessari.

Se si eliminano tutte le righe di una tabella con DELETE tablename oppure si esegue l'istruzione TRUNCATE TABLE, la tabella continua a esistere fino a quando non viene eliminata.

Le tabelle e gli indici di grandi dimensioni che utilizzano più di 128 extent vengono eliminati in due fasi distinte: logica e fisica. Nella fase logica, le unità di allocazione esistenti utilizzate dalla tabella vengono contrassegnate per la deallocazione e bloccate fino al completamento del commit della transazione. Nella fase fisica, le pagine IAM contrassegnate per la deallocazione vengono eliminate fisicamente in più batch. Per ulteriori informazioni, vedere Eliminazione e ricostruzione di oggetti di grandi dimensioni.

Se si elimina una tabella che contiene una colonna VARBINARY (MAX) con l'attributo FILESTREAM, non verrà rimosso alcun dato archiviato nel file system.

Nota importanteImportante

DROP TABLE e CREATE TABLE non devono essere eseguiti nella stessa tabella nello stesso batch. In caso contrario, è possibile che si verifichi un errore imprevisto.

Autorizzazioni

È richiesta l'autorizzazione ALTER per lo schema a cui appartiene la tabella, l'autorizzazione CONTROL per la tabella o l'appartenenza al ruolo predefinito del database db_ddladmin.

Esempi

A. Eliminazione di una tabella dal database corrente

Nell'esempio seguente vengono eliminati la tabella ProductVendor1 e i dati e gli indici corrispondenti dal database corrente.

DROP TABLE ProductVendor1 ;

B. Eliminazione di una tabella da un database diverso da quello corrente

Nell'esempio seguente viene eliminata la tabella SalesPerson2 nel database AdventureWorks2008R2. È possibile eseguire questo esempio da qualsiasi database nell'istanza del server.

DROP TABLE AdventureWorks2008R2.dbo.SalesPerson2 ;

C. Eliminazione di una tabella temporanea

Nell'esempio seguente viene creata una tabella temporanea, ne viene controllata l'esistenza, quindi la tabella viene eliminata e viene eseguito un ulteriore controllo dell'esistenza.

USE AdventureWorks2008R2;
GO
CREATE TABLE #temptable (col1 int);
GO
INSERT INTO #temptable
VALUES (10);
GO
SELECT * FROM #temptable;
GO
IF OBJECT_ID(N'tempdb..#temptable', N'U') IS NOT NULL 
DROP TABLE #temptable;
GO
--Test the drop.
SELECT * FROM #temptable;