답변:
다음을 수행하는 것이 맞습니까?
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의 답변을 참조하십시오 .
SQL Server 2016부터는
DROP TABLE IF EXISTS dbo.Scores
참조 : DROP IF EXISTS-SQL Server 2016의 새로운 기능
곧 SQL Azure 데이터베이스에있을 것입니다.
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 DB2 및 Microsoft SQL Server 7.0 이상을 포함한 기본 INFORMATION_SCHEMA 지원을 제공 합니다.
if exists
ANSI 규격?
실제로 작동하지 않는 많은 것을 보았습니다. 임시 테이블을 만들 때 tempdb에서 삭제해야합니다!
작동하는 유일한 코드는 다음과 같습니다.
IF OBJECT_ID('tempdb..#tempdbname') IS NOT NULL --Remove dbo here
DROP TABLE #tempdbname -- Remoeve "tempdb.dbo"
dbo
하는 tempdb
이 일을했다. 또한 'u'
허용 된 답변의 의견에 언급 된대로 추가하는 것이 좋습니다 . 따라서 전체 IF 문은 다음과 같습니다.IF OBJECT_ID('tempdb..#temp', 'U')
또는:
if exists (select * from sys.objects where name = 'Scores' and type = 'u')
drop table Scores
if exists (select * from sys.tables where name = 'Scores') drop table Scores
인수가 기존 테이블의 이름이면 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]
더 쉬운 방법이 있습니다
DROP TABLE IF EXISTS table_name;
Visual Studio를 사용하는 경우 메뉴 표시 줄에서 열면 시각적이고 쉬운 방법이 향상됩니다.
보기-> SQL Server 개체 탐색기
여기에 표시된 것처럼 열어야합니다
삭제할 테이블을 선택하고 마우스 오른쪽 단추로 클릭 한 다음 삭제하십시오. 이러한 화면이 표시되어야합니다. 데이터베이스 업데이트를 클릭하여 확인하십시오.
이 방법은 피드백을 제공하고 삭제 된 테이블과 다른 테이블의 관계에 대해 경고하므로 매우 안전합니다.
SQL
없습니다 Visual Studio
. 따라서이 답변은이 질문과 관련이 없습니다.
이렇게하면 가장 쉬운 방법입니다.
qry
선택 목록에서 원하는대로 검색어가됩니다.
set @qry = ' select * into TempData from (' + @qry + ')Tmp '
exec (@qry)
select * from TempData
drop table TempData
'U'
두 번째 매개 변수는 "이름이 테이블 인 오브젝트 만 찾습니다"를 의미합니다. 하나의 소스 . 그래서OBJECT_ID('TableName')
없는 잘못 이지만, 따라서 어느 미친 듯이 정확한 아니다'U'
마틴의 훌륭한 대답 @에서.