web-dev-qa-db-ja.com

SQLサーバーの一時テーブルが原因で「名前の付いたオブジェクトが既に存在します」エラーが発生する

SQL Serverには次の問題があります。次のようなコードがあります。

DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

SELECT LAST_NAME,FRST_NAME INTO #TMPGUARDIAN  FROM TBL_PEOPLE

これを行うと、「データベースに「#TMPGUARDIAN」という名前のオブジェクトが既に存在します」というエラーが表示されます。このエラーが発生する理由を教えてもらえますか?

43
Art F

ドロップしてから作成し、SELECT INTOを使用して再度作成しようとしています。への変更:

DROP TABLE #TMPGUARDIAN
CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

INSERT INTO #TMPGUARDIAN 
SELECT LAST_NAME,FRST_NAME  
FROM TBL_PEOPLE

MS SQL Serverでは、CREATE TABLEを使用して、SELECT INTOステートメントなしでテーブルを作成できます。

63
Hart CO

通常、これらの行はストアドプロシージャの最初に配置し、最後に配置します。

これは、#tempテーブルの「存在する」チェックです。

IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
begin
        drop table #MyCoolTempTable
end
30
granadaCoder

このようにクエリを変更する必要があります

CREATE TABLE #TMPGUARDIAN(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30))  

INSERT INTO #TMPGUARDIAN(FRST_NAME,LAST_NAME)
SELECT LAST_NAME,FRST_NAME  FROM TBL_PEOPLE

-すべての一時テーブルをクリアするための最後のセッションを作成します。常に最後にドロップします。あなたの場合、削除しようとしているときに、テーブルが存在しない場合にエラーが発生することがあります。

DROP TABLE #TMPGUARDIAN

insert intoの使用を避けるいくつかのプロセス(挿入を伴わない)。その時点で、同じ方法で作り直して設計する必要があります。

テーブル変数を使用 http://odetocode.com/articles/365.aspx

declare @userData TABLE(
 LAST_NAME NVARCHAR(30),
    FRST_NAME NVARCHAR(30)
)

利点これは変数に似ているため、Dropステートメントは不要です。実行直後にスコープが終了します。

7
kbvishnu

同じ.sqlファイル(同じワークスペース/タブ)に挿入クエリを書くなどのばかげた間違いをすることがあります。そのため、作成クエリが直前に記述されて既に実行されている挿入クエリを実行すると、再び実行が開始されます挿入クエリを使用します。

これが、オブジェクト名(テーブル名)を取得する理由です。2回目に実行されるためです。

別のタブに移動して、挿入またはドロップ、または実行しようとしているクエリを記述します。

または、同じワークスペース内のすべてのクエリの前にコメント行を使用します

CREATE -- …
-- Insert query
INSERT INTO -- …