この記事では、SQLServerにテーブルが存在するかどうかを確認するための5つのオプションを提供します。ほとんどのオプションにはシステムビューのクエリが含まれますが、オプションの1つはシステムストアドプロシージャを実行し、もう1つは関数を含みます。
簡単なIF
もいくつか含めます 状況に合わせて変更できるステートメント。
オプション1-sys.tablesビュー
このオプションは、sys.tables
にクエリを実行します システムカタログビュー。このビューは、各ユーザーテーブルの行を返します。したがって、チェックしているテーブル名を使用してクエリを実行できます。
例:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
結果:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
チェックするものにスキーマ名を追加することもできます。前のクエリを変更してスキーマ名を含める方法は次のとおりです。
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
結果:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
sys.tables
に注意してください viewはスキーマIDのみを返すため、それをSCHEMA_NAME()
に渡す必要がありました。 その名前を取得するための関数。または、スキーマIDを知っていれば、それを使用することもできます。
例:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
結果:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
オプション2–sp_tablesストアドプロシージャ
次のオプションは、sp_tables
を実行します ストアドプロシージャ。
この方法を使用すると、コードがどれほど簡潔になるかを次に示します。
sp_tables 'Artists'
結果:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
ただし、このストアドプロシージャはテーブルだけでなくビューも返すため、テーブルだけに絞り込むことをお勧めします(ビューを返すことに関心がある場合を除く)。テーブルだけに絞り込むには、@table_type = "'TABLE'"
を使用します 。
その間、テーブルの所有者とテーブルの修飾子を指定することもできます。
例:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
結果:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
@table_type
に注意することが重要です パラメーターは、コンマ区切りのリストを受け入れます。したがって、他のパラメータとは少し異なります。 @table_type
値は二重引用符で囲み、各項目は一重引用符で囲む必要があります。私の例では、リストアイテムは1つだけですが、それでも二重引用符と一重引用符の両方で囲む必要があります。
オプション3– INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.TABLES
システムビューは、現在のユーザーがアクセス許可を持っている現在のデータベースのテーブルまたはビューごとに1行を返します。 sys.tables
に似ています 、ただし、返される列は少なくなります。 SQL Serverに含まれる情報スキーマビューは、INFORMATION_SCHEMAのISO標準定義に準拠しています。
これを使用して、現在のデータベースにテーブルが存在するかどうかを確認する例を次に示します。
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
結果:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
ここでも同じですが、今回はスキーマも指定します:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
結果:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
オプション4– OBJECT_ID()関数
OBJECT_ID()
などの関数を使用することもできます NULL以外の値を返すかどうかを確認します。
例:
SELECT OBJECT_ID('Artists', 'U') AS Result;
結果:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
この場合、テーブルは存在します。 U
を使用したことに注意してください オブジェクトタイプ(ユーザー定義テーブル)を示します。
データベースとスキーマを含めるために、3つの部分からなる名前を指定することもできます。
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
結果:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
テーブルが存在しない場合は、NULL
が表示されます :
SELECT OBJECT_ID('Oops!', 'U') AS Result;
結果:
+----------+ | Result | |----------| | NULL | +----------+
IF
でこれを使用する例については、以下を参照してください ステートメント。
オプション5–sys.objectsビュー
前の例のどれもうまくいかないかのように、テーブルが存在するかどうかを確認するさらに別の方法があります。
今回はsys.objects
にクエリを実行します システムカタログビュー。このビューは、データベース内のユーザー定義のスキーマスコープのオブジェクトごとに行を返します。テーブルを返すだけでなく、あらゆる種類のオブジェクトを返します。したがって、テーブルだけに絞り込む必要があります。この場合、私はユーザー定義のテーブルにのみ関心があるので、type = 'U'
を使用できます。 (U
「USER_TABLE」用です)。または、TYPE_DESC = 'USER_TABLE'
を使用することもできます。 。
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
結果:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
ここでも、スキーマを指定しています:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
結果:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
オプション6– sys.sysobjectsビュー(AVOID)
このオプションは、使用しないことをお勧めできるようにのみリストされています。 sys.sysobjects
ビューは下位互換性のためにSQLServerに含まれているため、今後の作業ではこのビューを使用しないことをお勧めします。
このビューを使用するコードに遭遇した場合は、sys.objects
を使用するように変更することを検討してください。 または他のシステムビューまたはストアドプロシージャ。
いずれにせよ、sys.sysobjects
を使用した場合、前の例は次のようになります。 sys.objects
の代わりに 。
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
結果:
+-----------+ | id | |-----------| | 885578193 | +-----------+
IFステートメント1
これが簡単なIF
です テーブルの存在をチェックし、結果に応じて異なるメッセージを出力するステートメント。このコードは、特定のニーズに合わせて変更できます。
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
結果:
The table exists
そして、テーブルが存在しない場合は次のようになります。
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Customer' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
結果:
The table does not exist
IFステートメント2
別のIF
特定のニーズに合わせて変更できるステートメント。
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
結果:
The table exists