Vérifier si la table existe dans SQL Server

1143

Je voudrais que ce soit la discussion ultime sur la façon de vérifier si une table existe dans SQL Server 2000/2005 à l'aide d'instructions SQL.

Lorsque vous recherchez la réponse sur Google, vous obtenez tellement de réponses différentes. Existe-t-il une manière officielle / compatible en amont et en aval de le faire?

Voici deux façons de procéder. Laquelle des deux est la meilleure façon de le faire?

Première voie:

IF EXISTS (SELECT 1 
           FROM INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

Deuxième voie:

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL fournit le simple

SHOW TABLES LIKE '%tablename%'; 

déclaration. Je cherche quelque chose de similaire.

Vincent
la source
1
Pourquoi est-il préférable d'utiliser INFORMATION_SCHEMA.TABLES au lieu de sys.tables puis de filtrer avec le nom any peut-être ajouter une vérification de la valeur type_desc?
DanteTheSmith

Réponses:

1332

Pour des requêtes comme celle-ci, il est toujours préférable d'utiliser une INFORMATION_SCHEMAvue. Ces vues sont (généralement) standard dans de nombreuses bases de données différentes et changent rarement d'une version à l'autre.

Pour vérifier si une table existe, utilisez:

IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE TABLE_SCHEMA = 'TheSchema' 
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END
akmad
la source
12
Fonctionne très bien! Dans T-SQL (en réponse à l'affiche originale), cependant, c'est TABLE_SCHEMA, pas SCHEMA_NAME. Merci pour le conseil.
Nicholas Piasecki
10
Étant donné qu'un nom d'objet seul (c'est-à-dire sans schéma) n'est pas garanti d'être unique, il n'y a pas de moyen 100% sûr de le faire. Si vous travaillez avec une base de données qui n'a pas de conflits de noms entre les schémas, il suffit de supprimer simplement "TABLE_SCHEMA = 'TheSchema'".
akmad
26
Pour rechercher une table temporaire, nous devons interroger la base de données tempdb et utiliser un opérateur LIKE pour le nom de la tableSELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Pierre-Alain Vigeant
4
Une réponse ci-dessous qui utilise la fonction OBJECT_ID fonctionne correctement en ce qui concerne les tables temporaires par connexion - stackoverflow.com/a/2155299/16147
Rich Rousseau
4
Le compilateur de requêtes @akmad SQL vérifiera la table avant d'exécuter la requête et échouera avant même de démarrer.
Marc K
278

Notez également que si pour une raison quelconque vous devez rechercher une table temporaire, vous pouvez le faire:

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists
James Bloomer
la source
10
L'utilisation de cette méthode semble respecter la nature par connexion des tables temporaires. La requête INFORMATION_SCHEMA publiée précédemment renverra des lignes quelle que soit la connexion qui a créé la table.
Rich Rousseau
238

Nous utilisons toujours le OBJECT_IDstyle aussi longtemps que je me souvienne

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 
Bob King
la source
16
Je pense que ce serait rapide, mais pas très portable. Il est garanti que les vues de schéma d'informations existent sur tout DBRMS qui prend en charge la norme. De plus, plain OBJECT_ID ne garantit pas que l'objet est une table.
Joe Pineda
9
Merci Joe, je me demandais pourquoi vous utiliseriez OBJECT_ID vs INFORMATION_SCHEMA.TABLES vs sys.tables. Souligner que INFORMATION_SCHEMA fait partie d'une norme répond à peu près à cette question. BTW c'est drôle, un de nos experts en bases de données que j'allais poser cette question a le même nom que vous, doit être un bon nom pour les bases de données.
Apeiron
24
@JoePineda: Ensuite, vous utilisez la casse OBJECT_ID('TableName', 'U')pour garantir que l'objet est une table.
Allon Guralnek
1
@AllonGuralnek donc, au lieu de suivre une norme simple et portable, ajouter un morceau supplémentaire d'informations cryptiques?
définit
22
@DustinFineout: La question a été taguée tsql , donc la portabilité ne s'applique pas autant. En général, j'ai rencontré très peu de bases de code vraiment portables et si la brièveté est valorisée, alors elle bat à coup sûr l'écriture de cette IF EXISTSrequête à partir de la réponse acceptée. De plus, tout est cryptique jusqu'à ce que vous lisiez la documentation, en particulier en T-SQL (ou toute autre variante, vraiment).
Allon Guralnek
132

Veuillez consulter les approches ci-dessous,

Approche 1: utilisation de la vue INFORMATION_SCHEMA.TABLES

Nous pouvons écrire une requête comme ci-dessous pour vérifier si une table Customers existe dans la base de données actuelle.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

Approche 2: utilisation de la fonction OBJECT_ID ()

Nous pouvons utiliser la fonction OBJECT_ID () comme ci-dessous pour vérifier si une table Customers existe dans la base de données actuelle.

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

Approche 3: Utilisation de la vue catalogue sys.Objects

Nous pouvons utiliser la vue de catalogue Sys.Objects pour vérifier l'existence de la table comme indiqué ci-dessous:

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

Approche 4: Utilisation de la vue de catalogue sys.Tables

Nous pouvons utiliser la vue de catalogue Sys.Tables pour vérifier l'existence de la table comme indiqué ci-dessous:

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

Approche 5: éviter d'utiliser la table système sys.sysobjects

Nous devons éviter d'utiliser directement la table système sys.sysobjects, l'accès direct à celle-ci sera obsolète dans certaines versions futures du serveur SQL. Selon le lien Microsoft BOL, Microsoft suggère d'utiliser directement les vues de catalogue sys.objects / sys.tables au lieu de la table système sys.sysobjects.

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')
  BEGIN
     PRINT 'Table Exists'
  END

renvoyé de: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/

BrainCoder
la source
37

Recherche d'une table sur une autre base de données:

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
Larry Leonard
la source
26

Je voulais juste mentionner une situation où il serait probablement un peu plus facile d'utiliser la OBJECT_IDméthode. Les INFORMATION_SCHEMAvues sont des objets sous chaque base de données-

Les vues du schéma d'informations sont définies dans un schéma spécial nommé INFORMATION_SCHEMA. Ce schéma est contenu dans chaque base de données.

https://msdn.microsoft.com/en-us/library/ms186778.aspx

Par conséquent, toutes les tables auxquelles vous accédez en utilisant

IF EXISTS (SELECT 1 
           FROM [database].INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

ne reflétera que ce qui se trouve [database]. Si vous vouliez vérifier si des tables dans une autre base de données existent, sans changer dynamiquement à [database]chaque fois, OBJECT_IDcela vous permettra de le faire hors de la boîte. Ex-

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

fonctionne aussi bien que

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL 
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL SERVER 2016 Modifier :

À partir de 2016, Microsoft a simplifié la possibilité de rechercher des objets inexistants avant la suppression, en ajoutant les if existsmots clés aux dropinstructions. Par exemple,

drop table if exists mytablename

fera la même chose que OBJECT_ID/ INFORMATION_SCHEMAwrappers, sur 1 ligne de code.

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/

iliketocode
la source
25
IF OBJECT_ID('mytablename') IS NOT NULL 
sansalk
la source
13

L'utilisation du schéma d'information est la manière SQL Standard de le faire, il doit donc être utilisé par toutes les bases de données qui le prennent en charge.

Vinko Vrsalovic
la source
12
Cela aurait dû être un commentaire.
underscore_d
3
Cette réponse doit être améliorée.
rory.ap
11
IF EXISTS 
(
    SELECT   * 
    FROM     sys.objects 
    WHERE    object_id = OBJECT_ID(N'[dbo].[Mapping_APCToFANavigator]') 
             AND 
             type in (N'U')
)
BEGIN

    -- Do whatever you need to here.

END

Ici, dans le code ci-dessus, le nom de la table est Mapping_APCToFANavigator.

dilip kumar singh
la source
2
Si vous publiez du code, du XML ou des échantillons de données, veuillez mettre ces lignes en surbrillance dans l'éditeur de texte et cliquer sur le bouton "exemples de code" ( { }) dans la barre d'outils de l'éditeur pour bien mettre en forme et mettre en évidence la syntaxe!
marc_s
1
Notez que l'accès aux tables système pourrait être interrompu dans la future version de SQL Server. Utilisez plutôt des vues de schéma.
Olivier Jacot-Descombes
10

Si vous devez travailler sur différentes bases de données:

DECLARE @Catalog VARCHAR(255)
SET @Catalog = 'MyDatabase'

DECLARE @Schema VARCHAR(255)
SET @Schema = 'dbo'

DECLARE @Table VARCHAR(255)
SET @Table = 'MyTable'

IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES   
    WHERE TABLE_CATALOG = @Catalog 
      AND TABLE_SCHEMA = @Schema 
      AND TABLE_NAME = @Table))
BEGIN
   --do stuff
END
Même Mien
la source
1
Êtes-vous sûr? Le schéma d'information sur ma boîte 2005 ne renvoie que le catalogue actuel.
quillbreaker
8

Je sais que c'est une vieille question, mais j'ai trouvé cette possibilité si vous prévoyez de l'appeler souvent.

create procedure Table_Exists
@tbl varchar(50)
as
return (select count(*) from sysobjects where type = 'U' and name = @tbl)
go
dko
la source
9
-1. Inutile d'avoir une procédure pour cela car c'est autant de code à appeler et consommer le retour que simplement faire la sélection. Ne devrait pas utiliser le sysnametype de données varchar(50). Ne doit pas utiliser la sysobjectsvue obsolète et ne prend pas en compte le schéma.
Martin Smith
6

Vous pouvez utiliser le code ci-dessous

IF (OBJECT_ID('TableName') IS NOT NULL )
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END

Ou

IF (EXISTS (SELECT * FROM sys.tables WHERE [name] = 'TableName'))
BEGIN
  PRINT 'Table Exists'
END
ELSE
BEGIN 
  PRINT 'Table NOT Exists'
END
Reza Jenabi
la source
5

Ajout juste ici, pour le bénéfice des développeurs et des autres DBA

un script qui reçoit @Tablename comme paramètre

(qui peut contenir ou non le schéma) et renvoie les informations ci-dessous si le schéma.table existe:

the_name                object_id   the_schema  the_table       the_type
[Facts].[FactBackOrder] 758293761   Facts       FactBackOrder   Table

J'ai produit ce script pour être utilisé dans d'autres scripts chaque fois que je dois tester si une table ou une vue existe ou non, et quand c'est le cas, obtenir son object_id pour être utilisé à d'autres fins.

Il déclenche une erreur lorsque vous avez passé une chaîne vide, un nom de schéma incorrect ou un nom de table incorrect.

cela pourrait être à l'intérieur d'une procédure et retourner -1 par exemple.

Par exemple, j'ai une table appelée "Facts.FactBackOrder" dans l'une de mes bases de données Data Warehouse.

C'est ainsi que j'y suis parvenu:

PRINT 'THE SERVER IS ' + @@SERVERNAME
--select db_name()
PRINT 'THE DATABASE IS ' + db_NAME() 
PRINT ''
GO

SET NOCOUNT ON
GO

--===================================================================================
-- @TableName is the parameter
-- the object we want to deal with (it might be an indexed view or a table)
-- the schema might or might not be specified
-- when not specified it is DBO
--===================================================================================

DECLARE @TableName SYSNAME

SELECT @TableName = 'Facts.FactBackOrder'
--===================================================================================
--===================================================================================
DECLARE @Schema SYSNAME
DECLARE @I INT
DECLARE @Z INT 

SELECT @TableName = LTRIM(RTRIM(@TableName))
SELECT @Z = LEN(@TableName)

IF (@Z = 0) BEGIN

            RAISERROR('Invalid @Tablename passed.',16,1)

END 

SELECT @I = CHARINDEX('.',@TableName )
--SELECT @TableName ,@I

IF @I > 0 BEGIN

        --===================================================================================
        -- a schema and table name have been passed
        -- example Facts.FactBackOrder 
        -- @Schema = Fact
        -- @TableName = FactBackOrder
        --===================================================================================

   SELECT @Schema    = SUBSTRING(@TABLENAME,1,@I-1)
   SELECT @TableName = SUBSTRING(@TABLENAME,@I+1,@Z-@I)



END
ELSE BEGIN

        --===================================================================================
        -- just a table name have been passed
        -- so the schema will be dbo
        -- example Orders
        -- @Schema = dbo
        -- @TableName = Orders
        --===================================================================================

   SELECT @Schema    = 'DBO'     


END

        --===================================================================================
        -- Check whether the @SchemaName is valid in the current database
        --===================================================================================

IF NOT EXISTS ( SELECT * FROM INFORMATION_SCHEMA.SCHEMATA K WHERE K.[SCHEMA_NAME] = @Schema ) BEGIN

            RAISERROR('Invalid Schema Name.',16,1)

END 

--SELECT @Schema  as [@Schema]
--      ,@TableName as [@TableName]


DECLARE @R1 TABLE (

   THE_NAME SYSNAME
  ,THE_SCHEMA SYSNAME
  ,THE_TABLE SYSNAME
  ,OBJECT_ID INT
  ,THE_TYPE SYSNAME
  ,PRIMARY KEY CLUSTERED (THE_SCHEMA,THE_NAME)

)

;WITH RADHE_01 AS (
SELECT QUOTENAME(SCHEMA_NAME(O.schema_id)) + '.' + QUOTENAME(O.NAME) AS [the_name]
      ,the_schema=SCHEMA_NAME(O.schema_id)
      ,the_table=O.NAME
      ,object_id =o.object_id 
      ,[the_type]= CASE WHEN O.TYPE = 'U' THEN 'Table' ELSE 'View' END 
from sys.objects O
where O.is_ms_shipped = 0
AND O.TYPE IN ('U','V')
)
INSERT INTO @R1 (
   THE_NAME 
  ,THE_SCHEMA 
  ,THE_TABLE 
  ,OBJECT_ID
  ,THE_TYPE 
)
SELECT  the_name
       ,the_schema
       ,the_table
       ,object_id
       ,the_type
FROM RADHE_01
WHERE the_schema = @Schema 
  AND the_table  = @TableName

IF (@@ROWCOUNT = 0) BEGIN 

             RAISERROR('Invalid Table Name.',16,1)

END 
ELSE BEGIN

    SELECT     THE_NAME 
              ,THE_SCHEMA 
              ,THE_TABLE 
              ,OBJECT_ID
              ,THE_TYPE 

    FROM @R1

END 
Marcello Miorelli
la source
Il y a beaucoup d'hypothèses dans votre script. Par exemple, je pourrais facilement craquer une table nommée dbo.[hello.world ]et le script ne la trouverait pas pour plusieurs raisons. Cela dit, il est peu probable que quelqu'un veuille créer une telle table, mais quand même. Quoi qu'il en soit, votre THE_NAMEcolonne est définie comme des sysname', yet you try to squeeze 2 colonnes sysname` et un point ( .), tous entourés de crochets là-dedans ... celui-là est voué à l'échec un jour!
dérobie
@deroby Je suis d'accord que sysname n'est pas le meilleur type de données à utiliser, mais le script fonctionne depuis longtemps sans aucune erreur, je ne passerais du temps dessus que si je trouve une situation raisonnable où cela ne fonctionne pas. Encore mieux, vous prenez ce code, l'améliorez et le postez ici comme réponse et je le testerai, si cela fonctionne, je voterai pour votre réponse.
Marcello Miorelli
5

Dans SQL Server 2000, vous pouvez essayer:

IF EXISTS(SELECT 1 FROM sysobjects WHERE type = 'U' and name = 'MYTABLENAME')
BEGIN
   SELECT 1 AS 'res' 
END
dipi evil
la source
3
IF EXISTS 
(
    SELECT  * 

    FROM    INFORMATION_SCHEMA.TABLES 

    WHERE   TABLE_SCHEMA = 'PutSchemaHere'     
            AND  
            TABLE_NAME   = 'PutTableNameHere'
)
Moccassin
la source
2

Quelque chose d'important à savoir pour quiconque n'a pas encore trouvé sa solution: SQL server! = MYSQL . Si vous voulez le faire avec MYSQL , c'est assez simple

    $sql = "SELECT 1 FROM `db_name`.`table_name` LIMIT 1;";
    $result = mysql_query($sql);
    if( $result == false )
        echo "table DOES NOT EXIST";
    else
        echo "table exists";

Publier ceci ici, car c'est le meilleur succès de Google.

phil294
la source
4
-1 parce que l'OP demande précisément une solution SQL Server au problème, pas celle de MySQL. Il a écrit sur MySQL parce qu'il connaissait la solution sur ce SGBD et qu'il voulait le même résultat sur SQL Server. De plus, votre réponse n'est même pas une requête MySQL, mais un code PHP qui fonctionne avec MySQL.
mordack550
1
@ mordack550, je suis d'accord avec Blauhirn. Il a raison. C'est le meilleur hit sur Google pour savoir si une table existe en SQL. Ses intentions sont bonnes et ses informations sont utiles. +1
Mark
Il est regrettable que Microsoft ait l'habitude d'essayer d'adopter / d'étendre / d'éteindre des normes et des modèles communs comme SQL. Je souhaite vraiment qu'ils aient donné à leur implémentation d'un serveur SQL un nom propre afin que les gens puissent identifier sans ambiguïté les références spécifiques à leur produit.
psaxton
2
IF EXISTS (   SELECT * FROM   dbo.sysobjects WHERE  id = OBJECT_ID(N'dbo.TableName') AND OBJECTPROPERTY(id, N'IsUserTable') = 1 )
BEGIN
  SELECT * FROM dbo.TableName;
END
GO
Krishnaraj Barvathaya
la source
2

Vous pouvez utiliser ceci:

     IF OBJECT_ID (N'dbo.T', N'U') IS NOT NULL 
        BEGIN 
            print 'deleted table';
            drop table t 
        END
     else 
        begin 
            print 'table not found' 
        end

 Create table t (id int identity(1,1) not null, name varchar(30) not null, lastname varchar(25) null)
 insert into t( name, lastname) values('john','doe');
 insert into t( name, lastname) values('rose',NULL);

 Select * from t
1   john    doe
2   rose    NULL

 -- clean
 drop table t
BTE
la source
1
select name from SysObjects where xType='U' and name like '%xxx%' order by name
MarceloMadnezz
la source
1

- - créer une procédure pour vérifier si une table existe


DELIMITER $$

DROP PROCEDURE IF EXISTS `checkIfTableExists`;

CREATE PROCEDURE checkIfTableExists(
    IN databaseName CHAR(255),
    IN tableName CHAR(255),
    OUT boolExistsOrNot CHAR(40)
)

  BEGIN
      SELECT count(*) INTO boolExistsOrNot FROM information_schema.TABLES
      WHERE (TABLE_SCHEMA = databaseName)
      AND (TABLE_NAME = tableName);
  END $$

DELIMITER ;

- - comment utiliser: vérifier s'il existe des migrations de table


 CALL checkIfTableExists('muDbName', 'migrations', @output);
Mathieu Dierckx
la source
1
IF EXISTS (
SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE 
TABLE_CATALOG = 'Database Name' and
TABLE_NAME = 'Table Name' and 
TABLE_SCHEMA = 'Schema Name') -- Database and Schema name in where statement can be deleted

BEGIN
--TABLE EXISTS
END

ELSE BEGIN
--TABLE DOES NOT EXISTS
END
Mohamad Reza Shahrestani
la source
1

je prends ici la création d'une vue comme exemple .

Parce que les commandes ALTER / CREATE ne peuvent pas être dans les blocs BEGIN / END. Vous devez tester l'existence et la déposer avant de créer

IF Object_ID('TestView') IS NOT NULL
DROP VIEW TestView

GO

CREATE VIEW TestView
   as
   . . .

GO

Si vous craignez que les autorisations soient perdues, vous pouvez également créer un script pour les instructions GRANT et les réexécuter à la fin.

Vous pouvez envelopper le create / alter dans une chaîne et faire un EXEC - qui pourrait devenir moche pour les grandes vues

DECLARE @SQL as varchar(4000)

-- set to body of view
SET @SQL = 'SELECT X, Y, Z FROM TABLE' 

IF Object_ID('TestView') IS NULL
    SET @SQL = 'CREATE VIEW TestView AS ' + @SQL
ELSE    
    SET @SQL = 'ALTER VIEW TestView AS ' + @SQL
Kelum Sampath Edirisinghe
la source
0

Si quelqu'un essaie de faire la même chose dans linq to sql (ou en particulier linqpad), activez l'option pour inclure les tables et les vues système et procédez comme suit:

let oSchema = sys.Schemas.FirstOrDefault(s=>s.Name==a.schema )
where oSchema !=null
let o=oSchema!=null?sys.Objects.FirstOrDefault (o => o.Name==a.item && o.Schema_id==oSchema.Schema_id):null
where o!=null

étant donné que vous avez un objet avec le nom dans une propriété appelée élément, et le schéma dans une propriété appelée schéma où le nom de la variable source est a

Maslow
la source
0

Si cela doit être la discussion «ultime», il convient de noter que le script de Larry Leonard peut également interroger un serveur distant si les serveurs sont liés.

if exists (select * from REMOTE_SERVER.MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'
user3651072
la source
Peut-être qu'il est plus approprié d'ajouter cela en tant que commentaire à la réponse de Leonards ou peut-être en tant que modification?
EWit
0

J'ai eu quelques problèmes avec la sélection parmi INFORMATIONAL_SCHEME et OBJECT_ID. Je ne sais pas si c'est un problème de pilote ODBC ou quelque chose comme ça. Les requêtes du studio de gestion SQL, les deux, étaient correctes.

Voici la solution:

SELECT COUNT(*) FROM <yourTableNameHere>

Donc, si la requête échoue, il n'y a probablement pas de table de ce type dans la base de données (ou vous n'y avez pas les autorisations d'accès).

La vérification se fait en comparant la valeur (entier dans mon cas) retournée par l'exécuteur SQL qui traite du pilote ODBC.

if (sqlexec(conectionHandle, 'SELECT COUNT(*) FROM myTable') == -1) {
  // myTable doesn't exist..
}
Michael Quad
la source
Échoue avec quelle sortie?
wscourge
@wscourge, la requête SQL a échoué ou quelque chose de similaire. Je vérifie simplement la valeur de retour de la fonction exécuteur.
Michael Quad
Ajoutez-le à votre réponse
wscourge
0

Il existe une autre option pour vérifier si la table existe dans toutes les bases de données

IF EXISTS(SELECT 1 FROM [change-to-your-database].SYS.TABLES WHERE NAME = 'change-to-your-table-name')
BEGIN
    -- do whatever you want
END
Jitan Gupta
la source
-1

Exécutez cette requête pour vérifier si la table existe dans la base de données:

IF(SELECT TABLE_NAME from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'YourTableName') IS NOT NULL
PRINT 'Table Exists';
S Krishna
la source
-6

considérez dans une base de données que vous avez une table t1. vous voulez exécuter le script sur une autre base de données comme - si t1 existe alors ne faites rien d'autre créer t1. Pour faire ce studio visuel ouvert et procédez comme suit:

Cliquez avec le bouton droit sur t1, puis sur Table de script en tant que, puis DROP et Create To, puis sur New Query Editor

vous trouverez votre requête souhaitée. Mais avant d'exécuter ce script, n'oubliez pas de commenter l'instruction drop dans la requête car vous ne voulez pas en créer une nouvelle s'il y en a déjà une.

Merci

sumon
la source
Dans SSMS 2012, il n'effectue plus la vérification s'il existe, s'il l'a déjà fait (je ne me souviens pas comment les anciennes versions généraient le script ci-dessus). Peut-être que vous vous trompez avec la façon dont les autres outils de base de données sont des objets de table de script?
Ivaylo Slavov
SSMS effectuera la vérification si elle existe si vous le lui demandez. Outils> Options> Explorateur d'objets SQL Server> Script> "Options de script d'objet": "Vérifier l'existence d'objet" = Vrai
Seann Alexander