존재하는 경우 테이블을 삭제하는 방법은 무엇입니까?


721

테이블 이름은 Scores입니다.

다음을 수행하는 것이 맞습니까?

IF EXISTS(SELECT *
          FROM   dbo.Scores)
  DROP TABLE dbo.Scores

답변:


1377

다음을 수행하는 것이 맞습니까?

IF EXISTS(SELECT *
          FROM   dbo.Scores)
  DROP TABLE dbo.Scores

아니요 . 테이블에 행이 포함 된 경우에만 테이블이 삭제되고 테이블이 없으면 오류가 발생합니다.

대신 영구 테이블의 경우 사용할 수 있습니다

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL 
  DROP TABLE dbo.Scores; 

또는 임시 테이블의 경우 사용할 수 있습니다

IF OBJECT_ID('tempdb.dbo.#T', 'U') IS NOT NULL
  DROP TABLE #T; 

SQL Server 2016+는을 사용하는 더 좋은 방법 DROP TABLE IF EXISTS …입니다. @Jovan의 답변을 참조하십시오 .


137
Fwiw- 'U'두 번째 매개 변수는 "이름이 테이블 인 오브젝트 만 찾습니다"를 의미합니다. 하나의 소스 . 그래서 OBJECT_ID('TableName')없는 잘못 이지만, 따라서 어느 미친 듯이 정확한 아니다 'U'마틴의 훌륭한 대답 @에서.
ruffin

7
두 번째 매개 변수와 관련하여; 여기에 또 다른 출처가 있습니다.보기에 'V'를 사용했습니다.
The Red Pea

4
안녕하세요, OBJECT_ID ( 'tempdb.dbo. # T', 'U')에서이 두 번째 매개 변수가 무엇을 의미하는지 설명 할 수 있습니까 (예 : 'U')?
Zvonimir Tokic

9
@ZvonimirTokic "사용자 정의 테이블"을 의미합니다. "IT"는 내부 시스템 정의 테이블입니다. 전체 목록은 다음과 같습니다. msdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith


151

ANSI SQL / 크로스 플랫폼 방식은 INFORMATION_SCHEMA 를 사용하는 것으로 , 이는 SQL 데이터베이스 내의 객체에 대한 메타 데이터를 쿼리하도록 특별히 설계되었습니다.

if exists (select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo')
    drop table dbo.Scores;

대부분의 최신 RDBMS 서버는 최소한 MySQL , Postgres , Oracle , IBM DB2Microsoft SQL Server 7.0 이상을 포함한 기본 INFORMATION_SCHEMA 지원을 제공 합니다.


는 IS if existsANSI 규격?
마틴 스미스

8
데이터베이스에 둘 이상의 스키마가있는 경우주의하십시오. 감지하고 삭제하는 [점수]에 대해 구체적이어야 할 수도 있습니다. 예 WHERE TABLE_NAME = '점수'와 TABLE_SCHEMA = 'DBO'
앤드류 옌스

@kiquenet 일반적으로 그렇습니다. 그러나 if를 사용할 때는 사용하지 않습니다. 이것은 하나의 행을 반환하자마자 중지되기 때문입니다. 그러나 나는 개인적으로 항상 1을 선택합니다.
Harag

68

실제로 작동하지 않는 많은 것을 보았습니다. 임시 테이블을 만들 때 tempdb에서 삭제해야합니다!

작동하는 유일한 코드는 다음과 같습니다.

IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL     --Remove dbo here 
    DROP TABLE #tempdbname   -- Remoeve "tempdb.dbo"

3
덕분에, 변화 dbo하는 tempdb이 일을했다. 또한 'u'허용 된 답변의 의견에 언급 된대로 추가하는 것이 좋습니다 . 따라서 전체 IF 문은 다음과 같습니다.IF OBJECT_ID('tempdb..#temp', 'U')
whiteshooz

38

SQL Server 2016 (13.x) 이상에서

DROP TABLE IF EXISTS dbo.Scores

이전 버전에서

IF OBJECT_ID('dbo.Scores', 'U') IS NOT NULL 
DROP TABLE dbo.Scores; 

U는 당신이다table type


28

또는:

if exists (select * from sys.objects where name = 'Scores' and type = 'u')
    drop table Scores

4
2005 년부터 sys.tables를 사용하여이를 단순화 할 수 있습니다.if exists (select * from sys.tables where name = 'Scores') drop table Scores
Michael Parker

26

이게 도움이 되길 바란다:

begin try drop table #tempTable end try
begin catch end catch

22

인수가 기존 테이블의 이름이면 1을 반환하고 그렇지 않으면 0을 반환하는 작은 UDF를 작성했습니다.

CREATE FUNCTION [dbo].[Table_exists]
(
    @TableName VARCHAR(200)
)
    RETURNS BIT
AS
BEGIN
    If Exists(select * from INFORMATION_SCHEMA.TABLES where TABLE_NAME = @TableName)
        RETURN 1;

    RETURN 0;
END

GO

User존재하는 테이블을 삭제하려면 다음과 같이 호출하십시오.

IF [dbo].[Table_exists]('User') = 1 Drop table [User]

같은 이름이지만 다른 스키마는 어떻습니까? 가장 좋은 방법은 다음과 같습니다. stackoverflow.com/a/33497857/956364
인접

9

간단합니다 :

IF OBJECT_ID(dbo.TableName, 'U') IS NOT NULL
DROP TABLE dbo.TableName

여기서 dbo.TableName원하는 테이블입니다 'U' 입니다 type당신의 table.


6
IF EXISTS (SELECT NAME FROM SYS.OBJECTS WHERE object_id = OBJECT_ID(N'Scores') AND TYPE in (N'U'))
    DROP TABLE Scores
GO

4

나는 사용한다:

if exists (select * 
           from sys.tables 
           where name = 'tableName' 
           and schema_id = schema_id('dbo'))
begin
    drop table dbo.tableName
end


-1

Visual Studio를 사용하는 경우 메뉴 표시 줄에서 열면 시각적이고 쉬운 방법이 향상됩니다.

보기-> SQL Server 개체 탐색기

여기에 표시된 것처럼 열어야합니다

여기에 이미지 설명을 입력하십시오

삭제할 테이블을 선택하고 마우스 오른쪽 단추로 클릭 한 다음 삭제하십시오. 이러한 화면이 표시되어야합니다. 데이터베이스 업데이트를 클릭하여 확인하십시오.

여기에 이미지 설명을 입력하십시오

이 방법은 피드백을 제공하고 삭제 된 테이블과 다른 테이블의 관계에 대해 경고하므로 매우 안전합니다.


5
이 질문은와 (과) 관련이 SQL없습니다 Visual Studio. 따라서이 답변은이 질문과 관련이 없습니다.
Adnan Sharif 5

-8

이렇게하면 가장 쉬운 방법입니다.

qry 선택 목록에서 원하는대로 검색어가됩니다.

set @qry = ' select * into TempData from (' + @qry + ')Tmp  '

exec (@qry)

select * from TempData 

drop table TempData

4
그것은 단지 나입니까, 아니면 주사하기 쉬운 것처럼 보입니까? 의견을 부탁합니다.
g00dy

5
그것은 또한 질문과 관련이 없습니다
Martin Smith
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.