SQL Server 2008でストアドプロシージャを書いています。データベースにテーブルが存在するかどうかを確認する必要があります。そうでない場合は、作成する必要があります。
どうすればよいですか?
CREATE TABLE IF NOT EXISTS ...
SQL Server 2008でストアドプロシージャを書いています。データベースにテーブルが存在するかどうかを確認する必要があります。そうでない場合は、作成する必要があります。
どうすればよいですか?
CREATE TABLE IF NOT EXISTS ...
回答:
このようなもの
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
if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
対照的に、以下に示すように、object_id関数を使用します。少し読みやすく、sys.objects対sysobjects対sys.all_objects対sys.tablesについて心配する必要はありません。基本フォーム:
IF object_id('MyTable') is not null
PRINT 'Present!'
ELSE
PRINT 'Not accounted for'
ある場合、これはもちろん、「現在」として表示されます任意のその名前のオブジェクトが存在。テーブルだけをチェックしたい場合は、次のものが必要です。
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()関数を使用する
OBJECT_ID()
以下のような関数を使用して、tblTestテーブルが現在のデータベースに存在するかどうかを確認できます。
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()
関数に関するもう1つの注目すべき点は、現在の接続コンテキストで作成された一時テーブルの存在を確認するオプションを提供することです。他のすべてのアプローチは、現在の接続コンテキストだけでなく、すべての接続コンテキストにわたって作成された一時テーブルの存在をチェックします。以下のクエリは、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
テーブルオブジェクトの行のみを返すのに対し、Sys.Object
ビューはテーブルオブジェクトの行を返すだけでなく、ストアドプロシージャやビューなどのオブジェクトの行を返します。
アプローチ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/
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ブロック内にテーブルを作成できます。
sysobjects
古いコードの破損を回避するためにのみ存在する互換ビューです。私の提案はsys.objects
、sys.tables
SQL Server 2008インスタンスのみを対象とするコードにはシステムカタログビュー(など)を使用し、information_schema.tables
移植性が必要なコードには情報スキーマビュー(たとえば)を使用することです。さまざまなビューの詳細については、こちらをご覧ください