Réponses:
Est-il correct de faire ce qui suit?
IF EXISTS(SELECT * FROM dbo.Scores) DROP TABLE dbo.Scores
Non. Cela supprimera la table uniquement si elle contient des lignes (et générera une erreur si la table n'existe pas).
Au lieu de cela, pour une table permanente, vous pouvez utiliser
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
Ou, pour une table temporaire, vous pouvez utiliser
IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
DROP TABLE #T;
SQL Server 2016+ a une meilleure façon d'utiliser DROP TABLE IF EXISTS …
. Voir la réponse de @Jovan .
À partir de SQL Server 2016, vous pouvez utiliser
DROP TABLE IF EXISTS dbo.Scores
Référence: DROP IF EXISTS - nouveauté dans SQL Server 2016
Il sera bientôt dans la base de données SQL Azure.
La méthode ANSI SQL / multiplateforme consiste à utiliser INFORMATION_SCHEMA , qui a été spécialement conçu pour interroger les métadonnées sur les objets dans les bases de données SQL.
if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
drop table dbo.Scores;
La plupart des serveurs SGBDR modernes offrent au moins une prise en charge de base de INFORMATION_SCHEMA, notamment: MySQL , Postgres , Oracle , IBM DB2 et Microsoft SQL Server 7.0 (et versions ultérieures) .
if exists
ansi est-il conforme?
J'en ai vu tellement qui ne fonctionnent pas vraiment. lorsqu'une table temporaire est créée, elle doit être supprimée de tempdb!
Le seul code qui fonctionne est:
IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL --Remove dbo here
DROP TABLE #tempdbname -- Remoeve "tempdb.dbo"
dbo
pour tempdb
faire ce travail. Je voudrais également suggérer d'ajouter le 'u'
comme mentionné dans les commentaires de la réponse acceptée. Ainsi, la déclaration IF complète ressemblerait à ceci:IF OBJECT_ID('tempdb..#temp', 'U')
Dans SQL Server 2016 (13.x) et supérieur
DROP TABLE IF EXISTS dbo.Scores
Dans les versions antérieures
IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL
DROP TABLE dbo.Scores;
U est tontable type
Ou:
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
J'ai écrit un petit UDF qui renvoie 1 si son argument est le nom d'une table existante, 0 sinon:
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
Pour supprimer la table User
si elle existe, appelez-la ainsi:
IF [dbo].[Table_exists]('User') = 1 Drop table [User]
C'est simple:
IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName
où dbo.TableName
est votre table souhaitée et «U» est type
de votre table
.
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
DROP TABLE Scores
GO
J'utilise:
if exists (select *
from sys.tables
where name = 'tableName'
and schema_id = schema_id('dbo'))
begin
drop table dbo.tableName
end
Il existe un moyen plus simple
DROP TABLE IF EXISTS table_name;
Un meilleur moyen visuel et facile, si vous utilisez Visual Studio, ouvrez simplement la barre de menus,
Affichage -> Explorateur d'objets SQL Server
il devrait s'ouvrir comme indiqué ici
Sélectionnez et cliquez avec le bouton droit sur le tableau que vous souhaitez supprimer, puis supprimez. Un tel écran devrait être affiché. Cliquez sur Mettre à jour la base de données pour confirmer.
Cette méthode est très sûre car elle vous donne la rétroaction et vous avertira de toute relation de la table supprimée avec d'autres tables.
SQL
, non liée à Visual Studio
. Par conséquent, cette réponse est sans rapport avec cette question.
Faites comme ça, c'est le moyen le plus simple.
qry
sera votre propre requête, tout ce que vous voulez dans la liste de sélection.
set @qry = ' select * into TempData from (' + @qry + ')Tmp '
exec (@qry)
select * from TempData
drop table TempData
'U'
second paramètre signifie apparemment " Rechercher uniquement les objets de ce nom qui sont des tables". Une seule source . CeOBJECT_ID('TableName')
n'est donc pas faux , mais ce n'est pas incroyablement précis non plus, donc'U'
dans l'excellente réponse de @ Martin.