[sql-server] SQL Server에 테이블이 있는지 확인

SQL 문을 사용하여 SQL Server 2000/2005에 테이블이 있는지 확인하는 방법에 대한 궁극적 인 논의가되기를 바랍니다.

답변을 Google에 제공하면 다양한 답변을 얻을 수 있습니다. 공식 / 뒤로 및 앞으로 호환되는 방법이 있습니까?

가능한 두 가지 방법이 있습니다. 두 가지 중 어느 것이 표준 / 최고의 방법입니까?

첫 번째 방법 :

IF EXISTS (SELECT 1 
           FROM INFORMATION_SCHEMA.TABLES 
           WHERE TABLE_TYPE='BASE TABLE' 
           AND TABLE_NAME='mytablename') 
   SELECT 1 AS res ELSE SELECT 0 AS res;

두 번째 방법 :

IF OBJECT_ID (N'mytablename', N'U') IS NOT NULL
   SELECT 1 AS res ELSE SELECT 0 AS res;

MySQL 은 간단한

SHOW TABLES LIKE '%tablename%'; 

성명서. 비슷한 것을 찾고 있습니다.



답변

이와 같은 쿼리의 경우 항상 INFORMATION_SCHEMA보기 를 사용하는 것이 가장 좋습니다 . 이러한 뷰는 여러 데이터베이스에서 (대부분) 표준이며 버전마다 거의 변경되지 않습니다.

테이블이 존재하는지 확인하려면 다음을 사용하십시오.

IF (EXISTS (SELECT *
                 FROM INFORMATION_SCHEMA.TABLES
                 WHERE TABLE_SCHEMA = 'TheSchema'
                 AND  TABLE_NAME = 'TheTable'))
BEGIN
    --Do Stuff
END


답변

어떤 이유로 든 임시 테이블을 확인 해야하는 경우 다음을 수행 할 수 있습니다.

if OBJECT_ID('tempdb..#test') is not null
 --- temp table exists


답변

우리는 OBJECT_ID내가 기억 하는 한 항상 스타일을 사용합니다

IF OBJECT_ID('*objectName*', 'U') IS NOT NULL 


답변

아래의 접근법을 참조하십시오.

접근법 1 : INFORMATION_SCHEMA.TABLES 뷰 사용

Customers Table이 현재 데이터베이스에 있는지 확인하기 위해 아래와 같은 쿼리를 작성할 수 있습니다.

IF EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = N'Customers')
BEGIN
    PRINT 'Table Exists'
END

접근법 2 : OBJECT_ID () 함수 사용

아래와 같이 OBJECT_ID () 함수를 사용하여 Customers Table이 현재 데이터베이스에 있는지 확인할 수 있습니다.

IF OBJECT_ID(N'dbo.Customers', N'U') IS NOT NULL
BEGIN
    PRINT 'Table Exists'
END

접근 방식 3 : sys.Objects 카탈로그 뷰 사용

Sys.Objects 카탈로그 뷰를 사용하여 아래와 같이 테이블이 있는지 확인할 수 있습니다.

IF EXISTS(SELECT 1 FROM sys.Objects WHERE  Object_id = OBJECT_ID(N'dbo.Customers') AND Type = N'U')
BEGIN
   PRINT 'Table Exists'
END

방법 4 : sys.Tables 카탈로그 뷰 사용

Sys.Tables 카탈로그 뷰를 사용하여 아래와 같이 테이블이 있는지 확인할 수 있습니다.

 IF EXISTS(SELECT 1 FROM sys.Tables WHERE  Name = N'Customers' AND Type = N'U')
 BEGIN
      PRINT 'Table Exists'
 END

접근 방식 5 : sys.sysobjects 시스템 테이블 사용 금지

sys.sysobjects 시스템 테이블을 직접 사용하지 말아야합니다. 이후 버전의 Sql Server에서는이 테이블에 직접 액세스 할 수 없습니다. Microsoft BOL 링크에 따라 Microsoft는 sys.sysobjects 시스템 테이블 대신 카탈로그 뷰 sys.objects / sys.tables를 직접 사용하는 것이 좋습니다.

  IF EXISTS(SELECT name FROM sys.sysobjects WHERE Name = N'Customers' 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/


답변

다른 데이터베이스에서 테이블을 찾고 있습니다.

if exists (select * from MyOtherDatabase.sys.tables where name = 'MyTable')
    print 'Exists'


답변

OBJECT_ID방법 을 사용하는 것이 조금 더 쉬운 상황을 언급하고 싶었습니다 . INFORMATION_SCHEMA보기는 각 데이터베이스 – 아래 개체

정보 스키마 뷰는 INFORMATION_SCHEMA라는 특수 스키마에 정의되어 있습니다. 이 스키마는 각 데이터베이스에 포함되어 있습니다.

https://msdn.microsoft.com/en-us/library/ms186778.aspx

따라서 사용하는 모든 테이블을 사용하여

IF EXISTS (SELECT 1
           FROM [database].INFORMATION_SCHEMA.TABLES
           WHERE TABLE_TYPE='BASE TABLE'
           AND TABLE_NAME='mytablename')
   SELECT 1 AS res ELSE SELECT 0 AS res;

에있는 내용 만 반영합니다 [database]. 매번 동적으로 변경하지 않고 다른 데이터베이스의 테이블이 존재 하는지 확인 하려면 즉시 사용할 수 있습니다. 전의-[database]OBJECT_ID

IF OBJECT_ID (N'db1.schema.table1', N'U') IS NOT NULL
   SELECT 1 AS res ELSE SELECT 0 AS res;

뿐만 아니라 작동

IF OBJECT_ID (N'db2.schema.table1', N'U') IS NOT NULL
   SELECT 1 AS res ELSE SELECT 0 AS res;

SQL Server 2016 편집 :

2016 년부터 Microsoft는 삭제하기 전에 if exists키워드를 drop문 에 추가하여 존재하지 않는 개체를 확인하는 기능을 단순화했습니다 . 예를 들어

drop table if exists mytablename

한 줄의 코드에서 OBJECT_ID/ INFORMATION_SCHEMA래퍼 와 동일한 작업을 수행합니다 .

https://blogs.msdn.microsoft.com/sqlserverstorageengine/2015/11/03/drop-if-exists-new-thing-in-sql-server-2016/


답변

IF OBJECT_ID('mytablename') IS NOT NULL