테이블이 존재하고 존재하지 않는 경우 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 데이터베이스이지만 데이터베이스 tblTestdbo스키마에 테이블이 있는지 확인할 수 있음을 보여 줍니다 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.