Risposte:
È corretto fare quanto segue?
IF EXISTS(SELECT * FROM dbo.Scores) DROP TABLE dbo.Scores
No. Questo eliminerà la tabella solo se contiene delle righe (e genererà un errore se la tabella non esiste).
Invece, per una tabella permanente puoi usare
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
Oppure, per una tabella temporanea è possibile utilizzare
IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
DROP TABLE #T;
SQL Server 2016+ ha un modo migliore, usando DROP TABLE IF EXISTS …
. Vedi la risposta di @Jovan .
Da SQL Server 2016 è possibile utilizzare
DROP TABLE IF EXISTS dbo.Scores
Riferimento: DROP IF EXISTS - novità in SQL Server 2016
Sarà presto nel database SQL Azure.
Il metodo ANSI SQL / multipiattaforma consiste nell'utilizzare INFORMATION_SCHEMA , che è stato specificamente progettato per interrogare metadati su oggetti all'interno di database SQL.
if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
drop table dbo.Scores;
La maggior parte dei server RDBMS moderni fornisce almeno il supporto di base INFORMATION_SCHEMA, tra cui: MySQL , Postgres , Oracle , IBM DB2 e Microsoft SQL Server 7.0 (e versioni successive) .
if exists
ANSI è conforme?
Ne ho visti così tanti che non funzionano davvero. quando viene creata una tabella temporanea, questa deve essere eliminata dal tempdb!
L'unico codice che funziona è:
IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL --Remove dbo here
DROP TABLE #tempdbname -- Remoeve "tempdb.dbo"
dbo
per tempdb
rendere questo lavoro. Vorrei anche suggerire di aggiungere 'u'
quanto indicato nei commenti della risposta accettata. Pertanto, l'intera dichiarazione IF sarebbe simile a questa:IF OBJECT_ID('tempdb..#temp', 'U')
In SQL Server 2016 (13.x) e versioni successive
DROP TABLE IF EXISTS dbo.Scores
Nelle versioni precedenti
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
U è tuotable type
O:
if exists (select * from sys.objects where name = 'Scores' and type = 'u')
drop table Scores
if exists (select * from sys.tables where name = 'Scores') drop table Scores
Ho scritto un piccolo UDF che restituisce 1 se il suo argomento è il nome di una tabella esistente, 0 altrimenti:
CREATE FUNCTION [dbo].[Table_exists]
(
@TableName VARCHAR(200)
)
RETURNS BIT
AS
BEGIN
If Exists(select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = @TableName)
RETURN 1;
RETURN 0;
END
GO
Per eliminare la tabella User
se esiste, chiamala così:
IF [dbo].[Table_exists]('User') = 1 Drop table [User]
Semplice è che:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
dov'è dbo.TableName
il tavolo desiderato e "U" è il type
tuo table
.
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
Io uso:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
C'è un modo più semplice
DROP TABLE IF EXISTS table_name;
Un modo visivo e semplice migliore, se si utilizza Visual Studio, basta aprire dalla barra dei menu,
Visualizza -> Esplora oggetti di SQL Server
dovrebbe aprirsi come mostrato qui
Selezionare e fare clic con il pulsante destro del mouse sulla tabella che si desidera eliminare, quindi eliminare. Tale schermata dovrebbe essere visualizzata. Fare clic su Aggiorna database per confermare.
Questo metodo è molto sicuro in quanto ti dà il feedback e avviserà di eventuali relazioni della tabella eliminata con altre tabelle.
SQL
, non correlata Visual Studio
. Pertanto, questa risposta è irrilevante per questa domanda.
Fai così, è il modo più semplice.
qry
sarà la tua query, qualunque cosa tu voglia nell'elenco di selezione.
set @qry = ' select * into TempData from (' + @qry + ')Tmp '
exec (@qry)
select * from TempData
drop table TempData
'U'
secondo parametro apparentemente significa " Cerca solo oggetti con questo nome che siano tabelle". Una fonte . QuindiOBJECT_ID('TableName')
non è sbagliato , ma non è neanche follemente preciso, quindi'U'
nella risposta eccellente di @ Martin.