web-dev-qa-db-fra.com

Comment obtenir la liste des tables dans la base de données, en utilisant MS SQL 2008?

Je veux vérifier si une table existe dans une base de données, et si elle n'existe pas, pour la créer. Comment obtenir une liste de toutes les tables de la base de données actuelle?

Je pourrais obtenir la liste de base de données avec un SELECT comme celui-ci:

SELECT * FROM sys.databases

Il ne reste plus qu'à créer la table si elle n'existe pas.

J'ai également essayé de créer les tables en même temps avec la base de données comme ceci:

if not exists(select * from sys.databases where name = 'db')
begin 
    create database [db]
    use [db];
    create table [test] (
         Time datetime,
         Message varchar(1024) )
    end

Mais cela me donne une erreur sur la ligne "use", disant que "db" n'existe pas. Cette fois, je vais essayer de le faire en 2 commandes différentes.

27
Tibi

Cela devrait vous donner une liste de toutes les tables de votre base de données

SELECT Distinct TABLE_NAME FROM information_schema.TABLES

Vous pouvez donc l'utiliser de manière similaire à votre vérification de base de données.

If NOT EXISTS(SELECT Distinct TABLE_NAME FROM information_schema.TABLES Where TABLE_NAME = 'Your_Table')
BEGIN
    --CREATE TABLE Your_Table
END
GO
57
Brandon Boone

Cette requête vous obtiendra toutes les tables de la base de données

USE [DatabaseName];

SELECT * FROM information_schema.tables;
15
John Hartsock

En répondant à la question dans votre titre, vous pouvez interroger sys.tables ou sys.objectstype = 'U' pour vérifier l'existence d'une table. Vous pouvez également utiliser OBJECT_ID ('table_name', 'U'). S'il renvoie une valeur non nulle, la table existe:

IF (OBJECT_ID('dbo.My_Table', 'U') IS NULL)
BEGIN
    CREATE TABLE dbo.My_Table (...)
END

Vous pouvez faire de même pour les bases de données avec DB_ID ():

IF (DB_ID('My_Database') IS NULL)
BEGIN
    CREATE DATABASE My_Database
END

Si vous souhaitez créer la base de données puis commencer à l'utiliser, cela doit être fait en lots séparés. Je ne connais pas les détails de votre cas, mais il ne devrait pas y avoir beaucoup de cas où cela n'est pas possible. Dans un script SQL, vous pouvez utiliser des instructions GO. Dans une application, il est assez facile d'envoyer une nouvelle commande après la création de la base de données.

Le seul endroit où vous pourriez avoir un problème est que si vous essayez de le faire dans une procédure stockée et que la création de bases de données à la volée comme cela est généralement une mauvaise idée.

Si vous devez vraiment le faire en un seul lot, vous pouvez contourner le problème en utilisant EXEC pour contourner l'erreur d'analyse de la base de données qui n'existe pas:

CREATE DATABASE Test_DB2

IF (OBJECT_ID('Test_DB2.dbo.My_Table', 'U') IS NULL)
BEGIN
    EXEC('CREATE TABLE Test_DB2.dbo.My_Table (my_id INT)')
END

EDIT: Comme d'autres l'ont suggéré, le INFORMATION_SCHEMA.TABLES La vue système est probablement préférable car elle est censée être une norme à l'avenir et éventuellement entre les SGBDR.

5
Tom H