테이블이 존재하고 존재하지 않는 경우 SQL Server 2008에서 테이블을 작성하십시오.


130

SQL Server 2008에서 저장 프로 시저를 작성하고 있습니다. 데이터베이스에 테이블이 있는지 확인해야합니다. 그렇지 않으면 만들어야합니다.

어떻게해야합니까?


2
중복되지 않은 경우 관련 : SQL Server에 테이블이 있는지 확인하십시오 .

1
이것은 SQL Server를 사용하는 모든 사람이 결국 물어볼 수있는 좋은 질문입니다. SQL Server에 친숙한 Oracle 스타일의 CREATE OR REPLACE가 없다는 것은 슬픈 일입니다.
— Davos

1
MySQL의 경우CREATE TABLE IF NOT EXISTS ...
— John Henckel

답변:


148

이 같은

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

1
* 대신 인덱스 필드를 사용하여 (실행 계획을 위해) 약간의 변경 사항을 고려하십시오 (object_id는이 테이블에서 일반적으로 참조되는 숫자 필드입니다) (N'U ') 의 유형 대신 type ='U ' (열 _type 은 Nchar을 사용하는 char 유형 이며 암시 적 변환으로 인해 카디널리티 추정기에서 종종 문제가 발생 함)if (not exists (select object_id from sys.objects where object_id = OBJECT_ID(N'[dbo].[client_tgi_g67_period_list]') and type = 'U'))
— yeOldeDataSmythe

153

대조적으로, 아래 표시된 것처럼 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'

2
나는 일반적으로 다른 방법이 사용되는 것을 보았지만 (sys 테이블 확인) 이것은 읽기 쉽고 컴팩트 해 보입니다. 허용 된 답변 보다이 방법을 선호하지 않는 이유가 있습니까? (다른 DB 공급자로의 SQL 마이그레이션, 속도 등의 호환성 문제)?
— jedd.ahyoung

16

아래 스크립트를 사용하여 테이블이있는 샘플 데이터베이스를 작성하십시오.

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/


이 답변은 데이터베이스를 지정해야하는 방법과 그렇지 않은 방법을 제공합니다. 이는 매우 중요하며 동일한 인스턴스에서 동일한 데이터베이스가 여러 개 실행중인 경우 운영 데이터베이스를 설정하고 업데이트하기 위해 실행되는 스크립트에있어 이것이 핵심입니다! 훌륭한 정보.
— Nelda.는

11

편집

존재하는 원하는 테이블을 확인하기 위해 sys.tables 를 살펴볼 수 있습니다 .

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

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

END

3
IF (EXISTS (SELECT * 
                 FROM INFORMATION_SCHEMA.TABLES 
                 WHERE  TABLE_NAME = 'd020915'))
BEGIN
  declare @result int
  set @result=1
  select @result as result
END

1
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

1
StackOverflow에 오신 것을 환영합니다. 질문에 대답 할 때는 설명도 추가하십시오. 코드만으로는 대부분 도움이되지 않습니다.
— Viktor

0

다음 명령문을 사용하여 데이터베이스에 테이블이 있는지 확인하십시오.

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

if 블록 안에 테이블을 만들 수 있습니다.


3
해당 구문은 작동하지만 sysobjects이전 코드가 손상되지 않도록하기위한 호환성보기입니다. SQL Server 2008 인스턴스 만 대상으로하는 코드 sys.objects에는 시스템 카탈로그 뷰 (예 :)를 사용 sys.tables하고 information_schema.tables이식성이 필요한 코드에는 정보 스키마 뷰 (예 :)를 사용하는 것이 좋습니다. 다른 뷰에 대한 자세한 내용은 여기를 참조하십시오. SQL Server 시스템 카탈로그 쿼리
— ajk

-2

내가 틀리지 않으면 이것이 효과가 있습니다.

    if not exists (Select 1 from tableName)
create table ...

2
테이블이 존재하지만 비어있는 경우,이 경우에 해당됩니다.
— SQLMenace

@SQLMeance 아, sys.objects에서 'U'유형을 확인하고 있다는 귀하의 답변을 이해합니다. 그리고 테이블은 다른 곳에 존재할 수 있습니까? 미리 감사드립니다
— RaM
당사 사이트를 사용함과 동시에 당사의 쿠키 정책과 개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.