web-dev-qa-db-ja.com

テーブルが存在するかどうかを確認する方法とテーブルが存在しない場合はSQL Server 2008でテーブルを作成する

私はSQL Server 2008でStored procedureを書いています。それがtableがDBに存在するかどうかを確認する必要があります、それが存在しない場合は作成する必要があります。

どうすればいいのですか?

115
Prady

このようなもの

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
137
SQLMenace

対照的に、私は下記のように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'
142
Philip Kelley

以下のスクリプトで、テーブルを含むサンプルデータベースを作成しましょう。

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/

11

編集済み

存在を確認するためのテーブル--- sys.tablesを調べることができます。

IF  NOT EXISTS (SELECT * FROM sys.tables
WHERE name = N'YourTable' AND type = 'U')

BEGIN
CREATE TABLE [SchemaName].[YourTable](
    ....
    ....
    ....
) 

END
11
veljasije
IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE  TABLE_NAME = 'd020915'))
BEGIN
  declare @result int
  set @result=1
  select @result as result
END
3
Vinod kumar
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
0
Aamir Shaikh

次の文を試して、データベース内にテーブルが存在するかどうかを確認してください。

If not exists (select name from sysobjects where name = 'tablename')

Ifブロックの中にテーブルを作成することができます。

0
Only You