データベースにテーブルが存在するかどうかを確認し、存在しない場合は作成します。現在のデータベース内のすべてのテーブルのリストを取得するにはどうすればよいですか?
次のような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つの異なるコマンドでこれを実行しようとします。
これにより、データベース内のすべてのテーブルのリストが表示されます。
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
このクエリは、データベース内のすべてのテーブルを取得します
USE [DatabaseName];
SELECT * FROM information_schema.tables;
タイトルの質問に答えると、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間で進められる標準であると思われるため、おそらく望ましいでしょう。