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 vs. sysobjects vs. sys.all_objects vs. 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()
함수 에 관해 언급해야 할 또 하나의 주목할만한 점 은 현재 연결 컨텍스트에서 작성된 임시 테이블의 존재를 점검하는 옵션을 제공한다는 것입니다. 다른 모든 접근 방식은 현재 연결 컨텍스트 대신 모든 연결 컨텍스트에서 생성 된 임시 테이블이 있는지 확인합니다. 아래 쿼리는 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
이전 코드가 손상되지 않도록하기위한 호환성보기입니다. SQL Server 2008 인스턴스 만 대상으로하는 코드 sys.objects
에는 시스템 카탈로그 뷰 (예 :)를 사용 sys.tables
하고 information_schema.tables
이식성이 필요한 코드에는 정보 스키마 뷰 (예 :)를 사용하는 것이 좋습니다. 다른 뷰에 대한 자세한 내용은 여기를 참조하십시오. SQL Server 시스템 카탈로그 쿼리