web-dev-qa-db-ja.com

MS SQL 2008を使用して、データベースのテーブルリストを取得する方法は?

データベースにテーブルが存在するかどうかを確認し、存在しない場合は作成します。現在のデータベース内のすべてのテーブルのリストを取得するにはどうすればよいですか?

次のようなSELECTでデータベースリストを取得できます。

SELECT * FROM sys.databases

残っているのは、存在しない場合はテーブルを作成することです。

また、次のようなデータベースでテーブルを同時に作成しようとしました:

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

しかし、「use」行に「db」が存在しないというエラーが表示されます。今回は、2つの異なるコマンドでこれを実行しようとします。

27
Tibi

これにより、データベース内のすべてのテーブルのリストが表示されます。

SELECT Distinct TABLE_NAME FROM information_schema.TABLES

したがって、データベースチェックと同様に使用できます。

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

このクエリは、データベース内のすべてのテーブルを取得します

USE [DatabaseName];

SELECT * FROM information_schema.tables;
15
John Hartsock

タイトルの質問に答えると、sys.tablesまたはsys.objectsここでtype = 'U'テーブルの存在を確認します。 OBJECT_ID( 'table_name'、 'U')を使用することもできます。 null以外の値を返す場合、テーブルは存在します。

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

DB_ID()を使用するデータベースに対しても同じことができます。

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

データベースを作成してから使用を開始する場合は、個別のバッチで実行する必要があります。私はあなたのケースの詳細を知りませんが、これが不可能なケースは多くないはずです。 SQLスクリプトでは、GOステートメントを使用できます。アプリケーションでは、データベースの作成後に新しいコマンドを介して送信するのは簡単です。

問題が発生する可能性がある唯一の場所は、ストアドプロシージャでこれを実行しようとしていて、そのようなデータベースをその場で作成することは通常悪い考えです。

本当に1つのバッチでこれを行う必要がある場合は、EXECを使用して、存在しないデータベースの解析エラーを回避することで問題を回避できます。

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

編集:他の人が示唆したように、INFORMATION_SCHEMA.TABLESシステムビューは、おそらくRDBMS間で進められる標準であると思われるため、おそらく望ましいでしょう。

5
Tom H