私はSQL Server 2008でStored procedure
を書いています。それがtable
がDBに存在するかどうかを確認する必要があります、それが存在しない場合は作成する必要があります。
どうすればいいのですか?
このようなもの
IF NOT EXISTS (SELECT * FROM sys.objects
WHERE object_id = OBJECT_ID(N'[dbo].[YourTable]') AND type in (N'U'))
BEGIN
CREATE TABLE [dbo].[YourTable](
....
....
....
)
END
対照的に、私は下記のようにobject_id関数を使うのが好きです。読みやすくなり、sys.objectsとsysobjectsとsys.all_objectsとsys.tablesの関係を心配する必要はありません。基本フォーム:
IF object_id('MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
その名前でanyオブジェクトが存在する場合、もちろんこれは "Present"として表示されます。テーブルだけをチェックしたい場合は、次のものが必要です。
IF object_id('MyTable', 'U') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
これは一時テーブルでも同様に機能します。
IF object_id('tempdb.dbo.#MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
以下のスクリプトで、テーブルを含むサンプルデータベースを作成しましょう。
CREATE DATABASE Test
GO
USE Test
GO
CREATE TABLE dbo.tblTest (Id INT, Name NVARCHAR(50))
アプローチ1:INFORMATION_SCHEMA.TABLESビューを使用する
現在のデータベースにtblTestテーブルが存在するかどうかを確認するために、以下のようなクエリを書くことができます。
IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
上記のクエリは、現在のデータベース内のすべてのスキーマにわたってtblTestテーブルの存在を確認します。もしあなたが指定されたスキーマと指定されたデータベースの中にテーブルの存在をチェックしたいのであればこれの代わりに以下のように上記のクエリを書くことができます:
IF EXISTS (SELECT * FROM Test.INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'tblTest')
BEGIN
PRINT 'Table Exists'
END
このアプローチの長所:INFORMATION_SCHEMAビューは異なるRDBMSシステム間で移植可能であるため、異なるRDBMSへの移植は変更を必要としません。
アプローチ2:OBJECT_ID()関数を使う
現在のデータベースにtblTestテーブルが存在するかどうかを確認するには、以下のようにOBJECT_ID()
関数を使用します。
IF OBJECT_ID(N'dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
テーブル名にデータベース名とスキーマ名の部分を指定することはオプションです。ただし、データベース名とスキーマ名を指定すると、すべてのスキーマにわたって現在のデータベースをチェックインするのではなく、指定したデータベース内および指定したスキーマ内にテーブルの存在をチェックするオプションが提供されます。以下のクエリは、現在のデータベースがMASTERデータベースであっても、tblTest
データベースのdbo
スキーマにあるTest
テーブルの存在を確認できることを示しています。
USE MASTER
GO
IF OBJECT_ID(N'Test.dbo.tblTest', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
長所:覚えやすいです。 OBJECT_ID()
関数について言及するもう一つの注目すべき点は、それは現在の接続コンテキストで作成された一時テーブルの存在をチェックするオプションを提供します。他のすべてのアプローチは、現在の接続コンテキストだけでなく、すべての接続コンテキストにわたって作成された一時テーブルの存在を確認します。以下のクエリは、OBJECT_ID()
関数を使用して一時テーブルの存在を確認する方法を示しています。
CREATE TABLE #TempTable(ID INT)
GO
IF OBJECT_ID(N'TempDB.dbo.#TempTable', N'U') IS NOT NULL
BEGIN
PRINT 'Table Exists'
END
GO
アプローチ3:sys.Objectsカタログビューを使用する
以下に示すように、Sys.Objects
カタログビューを使用してテーブルの存在を確認できます。
IF EXISTS(SELECT 1 FROM sys.Objects WHERE Object_id = OBJECT_ID(N'dbo.tblTest') AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
アプローチ4:sys.Tablesカタログビューを使う
以下に示すように、Sys.Tables
カタログビューを使用してテーブルの存在を確認できます。
IF EXISTS(SELECT 1 FROM sys.Tables WHERE Name = N'tblTest' AND Type = N'U')
BEGIN
PRINT 'Table Exists'
END
Sys.Tables
カタログ・ビューはSys.Objects
カタログ・ビューから行を継承し、Sys.objects
カタログ・ビューは基本ビューと呼ばれ、sys.Tables
は派生ビューと呼ばれます。 Sys.Tables
はTableオブジェクトの行のみを返しますが、Sys.Object
viewはテーブルオブジェクトの行を返すのとは別に、ストアドプロシージャ、ビューなどのオブジェクトの行を返します。
アプローチ5:sys.sysobjectsシステムテーブルを使用しない
sys.sysobjects
システムテーブルを直接使用しないでください。直接アクセスすることは将来のSql Serverのバージョンでは推奨されなくなります。 [Microsoft BOL] [1]リンクに従って、Microsoftはsys.objects/sys.tables
システムテーブルの代わりにカタログビューsys.sysobjects
を直接使用することを推奨しています。
IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'tblTest' AND xtype = N'U')
BEGIN
PRINT 'Table Exists'
END
参照: http://sqlhints.com/2014/04/13/how-to-check-if-a-table-exists-in-sql-server/
編集済み
存在を確認するためのテーブル--- sys.tablesを調べることができます。
IF NOT EXISTS (SELECT * FROM sys.tables
WHERE name = N'YourTable' AND type = 'U')
BEGIN
CREATE TABLE [SchemaName].[YourTable](
....
....
....
)
END
IF (EXISTS (SELECT *
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_NAME = 'd020915'))
BEGIN
declare @result int
set @result=1
select @result as result
END
Declare @Username varchar(20)
Set @Username = 'Mike'
if not exists
(Select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'tblEmp')
Begin
Create table tblEmp (ID int primary key, Name varchar(50))
Print (@Username + ' Table created successfully')
End
Else
Begin
Print (@Username + ' : this Table Already exists in the database')
End
次の文を試して、データベース内にテーブルが存在するかどうかを確認してください。
If not exists (select name from sysobjects where name = 'tablename')
Ifブロックの中にテーブルを作成することができます。