テーブルが存在するかどうかに基づいてコードを実行する必要があるシナリオに何度も遭遇します。 この記事では、一般的に使用されているさまざまなアプローチとその長所と短所を一覧表示します。 覚えやすいので、OBJECT_ID()関数を使用することをお勧めします。 私はあなたが使用するアプローチと同じ理由を知ってみましょう。これらの異なるアプローチをデモするには、以下のスクリプトでテーブルを持つサンプルデータベースを作成しましょう。
CREATE DATABASE SqlHintsDemoDBGOUSE SqlHintsDemoDBGOCREATE TABLE dbo.Customers (CustId INT, Name NVARCHAR(50))
一時テーブルがSql Serverに存在するかどうかを確認する方法は?
アプローチ1:INFORMATION_SCHEMAを使用します。テーブルビュー
現在のデータベースにCustomersテーブルが存在するかどうかを確認するために、以下のようなクエリを書くことができます。p>
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')BEGIN PRINT 'Table Exists'END
結果:
上記のクエリは、現在のデータベース内のすべてのスキーマにわたってCustomersテーブル この代わりに、指定されたスキーマと指定されたデータベース内のテーブルの存在を確認したい場合は、上記のクエリを以下のように記述できます。
IF EXISTS (SELECT * FROM SqlHintsDemoDB.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Customers')BEGIN PRINT 'Table Exists'END
RESULT:
このアプローチの長所: INFORMATION_SCHEMAビューは、異なるRDBMSシステム間で移植可能であるため、異なるRDBMSに移植しても変更は必要ありません。
ストアドプロシージャがSql Serverに存在するかどうかを確認する方法
アプローチ2:OBJECT_ID()関数を使用する
以下のようなOBJECT_ID()関数を使用して、現在のデータベースにCustomersテーブルが存在するかどうかを確認することができます。p>
IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'END
結果:
テーブル名のデータベース名とスキーマ名の部分を指定することはオプ ただし、データベース名とスキーマ名を指定すると、現在のデータベースをすべてのスキーマでチェックインするのではなく、指定したデータベースおよび指定したス 以下のクエリは、現在のデータベースがMASTERデータベースであっても、SqlHintsDemoDBデータベースのdboスキーマ内のCustomersテーブルの存在を確認できることを示しています。結果:
長所:覚えやすい。 OBJECT_ID()関数について言及するもう一つの注目すべき点は、現在の接続コンテキストで作成された一時テーブルの存在をチェックするオプションを提供 他のすべての方法では、現在の接続コンテキストだけではなく、すべての接続コンテキストにわたって作成された一時テーブルの存在をチェッ 以下のクエリは、OBJECT_ID()関数を使用して一時テーブルの存在を確認する方法を示しています。
CREATE TABLE #TempTable(ID INT)GOIF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULLBEGIN PRINT 'Table Exists'ENDGO
結果:
Sql Serverにデータベースが存在するかどうかを確認する方法
アプローチ3:sysを使用する。オブジェクトカタログビュー
私たちは、Sysを使用することができます。オブジェクトカタログビューは、以下に示すように、テーブルの存在を確認します。
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')BEGIN PRINT 'Table Exists'END
結果
レコードがテーブルに存在するかどうかを確認する方法
アプローチ4:sysを使用します。テーブルカタログビュー
私たちは、Sysを使用することができます。テーブルカタログビューは、以下に示すように、テーブルの存在を確認します。
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'Customers' AND Type = N'U')BEGIN PRINT 'Table Exists'END
結果
Sys。テーブルカタログビューは、Sysから行を継承します。オブジェクトカタログビュー、Sys。オブジェクトカタログビューは、ベースビューと呼ばれ、sysと呼ばれます。テーブルは派生ビューと呼ばれます。 シスオ…テーブルはテーブルオブジェクトに対してのみ行を返しますが、Sys。オブジェクトビューテーブルオブジェクトの行を返すのとは別に、ストアドプロシージャ、ビューなどのオブジェクトの行を返します。ビューがSql Serverに存在するかどうかを確認する方法
アプローチ5:sysを使用しないでください。sysobjectsシステムテーブル
sysを使用しないようにしてください。sysobjectsシステムテーブルへの直接アクセスは、Sql Serverの将来のバージョンでは非推奨になります。 Microsoft BOLリンクによると、Microsoftはcatalog views sysを使用することを提案しています。オブジェクト/sys.sysの代わりにテーブル。sysobjectsシステムテーブルを直接。
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' AND xtype = N'U')BEGIN PRINT 'Table Exists'END
結果:
:
データベースが存在するかどうかを確認する方法
ストアドプロシージャがSql Serverに存在するかどうかを確認する方法
ビューが存在するかどうかを確認する方法
一時テーブルが存在するかどうかを確認する方法
レコードがテーブルに存在するかどうかを確認する方法