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.
Réponses:
Pour des requêtes comme celle-ci, il est toujours préférable d'utiliser une
INFORMATION_SCHEMA
vue. 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:
la source
SELECT * FROM tempdb.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'TheSchema' AND TABLE_NAME LIKE '#TheTable%'
Notez également que si pour une raison quelconque vous devez rechercher une table temporaire, vous pouvez le faire:
la source
Nous utilisons toujours le
OBJECT_ID
style aussi longtemps que je me souviennela source
OBJECT_ID('TableName', 'U')
pour garantir que l'objet est une table.IF EXISTS
requê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).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.
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.
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:
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:
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.
renvoyé de: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
la source
Recherche d'une table sur une autre base de données:
la source
Je voulais juste mentionner une situation où il serait probablement un peu plus facile d'utiliser la
OBJECT_ID
méthode. LesINFORMATION_SCHEMA
vues sont des objets sous 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
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_ID
cela vous permettra de le faire hors de la boîte. Ex-fonctionne aussi bien que
SQL SERVER 2016 Modifier :
À partir de 2016, Microsoft a simplifié la possibilité de rechercher des objets inexistants avant la suppression, en ajoutant les
if exists
mots clés auxdrop
instructions. Par exemple,fera la même chose que
OBJECT_ID
/INFORMATION_SCHEMA
wrappers, sur 1 ligne de code.https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/
la source
la source
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.
la source
Ici, dans le code ci-dessus, le nom de la table est
Mapping_APCToFANavigator
.la source
{ }
) dans la barre d'outils de l'éditeur pour bien mettre en forme et mettre en évidence la syntaxe!Si vous devez travailler sur différentes bases de données:
la source
Je sais que c'est une vieille question, mais j'ai trouvé cette possibilité si vous prévoyez de l'appeler souvent.
la source
sysname
type de donnéesvarchar(50)
. Ne doit pas utiliser lasysobjects
vue obsolète et ne prend pas en compte le schéma.Vous pouvez utiliser le code ci-dessous
Ou
la source
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:
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:
la source
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, votreTHE_NAME
colonne est définie comme dessysname', 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!Dans SQL Server 2000, vous pouvez essayer:
la source
la source
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
Publier ceci ici, car c'est le meilleur succès de Google.
la source
la source
Vous pouvez utiliser ceci:
la source
la source
- - créer une procédure pour vérifier si une table existe
- - comment utiliser: vérifier s'il existe des migrations de table
la source
la source
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
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
la source
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:
é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
la source
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.
la source
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:
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.
la source
Il existe une autre option pour vérifier si la table existe dans toutes les bases de données
la source
Exécutez cette requête pour vérifier si la table existe dans la base de données:
la source
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
la source