テーブルが存在する場合、どのようにドロップしますか?


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'2番目のパラメーターのforは、明らかに「この名前でテーブルであるオブジェクトのみを探す」ことを意味します。 1つのソース。だから間違いOBJECT_ID('TableName')はありませが、それもめちゃくちゃ正確ではないので'U'、@ Martinの優れた答えでは。
ruffin 2013年

7
2番目のパラメーターについて。これは別のソースです。ビューに「V」を使用しました。
Red Pea 2014

4
こんにちは、この2番目のパラメーターがOBJECT_ID( 'tempdb.dbo。#T'、 'U')で何を意味するか、たとえばこの 'U'について説明できますか?
Zvonimir Tokic 2016

9
@ZvonimirTokic「ユーザー定義テーブル」を意味します。「IT」は内部のシステム定義のテーブルになります。完全なリストはこちらmsdn.microsoft.com/en-us/library/ms190324.aspx
Martin Smith


151

ANSI SQL /クロスプラットフォームの方法は、SQLデータベース内のオブジェクトに関するメタデータをクエリするように特別に設計されたINFORMATION_SCHEMAを使用することです。

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

最近のほとんどのRDBMSサーバーは、少なくとも、基本的なINFORMATION_SCHEMAサポートを提供します。これには、MySQLPostgresOracleIBM DB2、およびMicrosoft SQL Server 7.0(およびそれ以上)が含まれます。


あるif existsANSI準拠しましたか?
マーティン・スミス

8
データベースに複数のスキーマがある場合は注意してください。検出および削除する[スコア]を具体的に指定する必要がある場合があります。たとえば、WHERE TABLE_NAME = 'Scores' AND TABLE_SCHEMA = 'dbo'
Andrew Jens

@kiquenet一般的にはい、ただしifが存在する場合はそうではありません-これは1行を返すとすぐに停止するためです。とにかく、私はとにかく常に1つを選択します。
Harag

68

実際に機能しない多くの人を見てきました。一時テーブルが作成されたら、tempdbから削除する必要があります。

機能する唯一のコードは次のとおりです。

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

3
ありがとう、この作品に変更dbotempdbました。また'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
マイケル・パーカー

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



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

-8

このようにしてください、それが最も簡単な方法です。

qry 選択リストで必要なものは何でも、独自のクエリになります。

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

exec (@qry)

select * from TempData 

drop table TempData

4
それは私だけですか、それとも注射が起こりやすいですか?コメントしてください。
g00dy 2017年

5
それはまた、質問とは何の関係もありません
マーティン・スミス
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.