簡體   English   中英

刪除\\在SQL Server 2008中創建臨時表

[英]Deletion\Creation of Temp tables in SQL Server 2008

我有這樣的SQL代碼

IF Object_id('tempdb..#empDate) IS NOT NULL
  DROP TABLE #empDate
CREATE TABLE #empDate
  (
     [empID]   INT,
     [AddLoc] VARCHAR(1000)
  )

在上面的代碼之后會有更多的SQL行,然后重復它。

我收到以下錯誤。

Msg 2714,Level 16,State 1,Line 589
數據庫中已經有一個名為“#empDate”的對象。

我換了

IF Object_id('tempdb..#empDate) IS NOT NULL

IF Object_id('tempdb..#empDate%) IS NOT NULL

正如在SQL論壇上寫的那樣,SQL Server將數字附加到后續的臨時表中。

來源: 檢查臨時表是否存在,如果存在,則在創建臨時表之前刪除

http://blog.sqlauthority.com/2009/05/17/sql-server-how-to-drop-temp-table-check-existence-of-temp-table/

http://blog.sqlauthority.com/2009/03/29/sql-server-fix-error-msg-2714-level-16-state-6-there-is-already-an-object-named-temp-在最數據庫/

我在Windows 7企業版上使用Microsoft SQL Server 2008。

我無法理解錯誤的原因。

請幫忙。

樣本一

這將失敗......再次執行相同的代碼,將拋出你現在得到的錯誤

IF Object_id('tempdb..#empDate') IS NOT NULL
 BEGIN
  DROP TABLE #empDate
 END 

CREATE TABLE #empDate
  (
     [empID]   INT,
     [AddLoc] VARCHAR(1000)
  )


IF Object_id('tempdb..#empDate') IS NOT NULL
 BEGIN
  DROP TABLE #empDate
 END 

CREATE TABLE #empDate
  (
     [empID]   INT,
     [AddLoc] VARCHAR(1000)
  )

樣本二(固定)

IF Object_id('tempdb..#empDate') IS NOT NULL
 BEGIN
  DROP TABLE #empDate
 END 

CREATE TABLE #empDate
  (
     [empID]   INT,
     [AddLoc] VARCHAR(1000)
  )

GO      --<-- Adding this Batch Separator will eliminate the Error

IF Object_id('tempdb..#empDate') IS NOT NULL
 BEGIN
  DROP TABLE #empDate
 END 

CREATE TABLE #empDate
  (
     [empID]   INT,
     [AddLoc] VARCHAR(1000)
  )

測試

如果您嘗試在一個BATCH中執行以下語句,即使沒有任何名稱為#empDate表,它們也會失敗,它甚至不會執行第一個Create表語句。 並會拋出錯誤。

CREATE TABLE #empDate
  (
     [empID]   INT,
     [AddLoc] VARCHAR(1000)
  )


DROP TABLE #empDate


CREATE TABLE #empDate
  (
     [empID]   INT,
     [AddLoc] VARCHAR(1000)
  )

但是如果你在不同批次中分離所有語句,它們將成功地執行這樣的事情。

CREATE TABLE #empDate
  (
     [empID]   INT,
     [AddLoc] VARCHAR(1000)
  )
GO

DROP TABLE #empDate
GO

CREATE TABLE #empDate
  (
     [empID]   INT,
     [AddLoc] VARCHAR(1000)
  )
GO

我會放棄你的桌子而不進行任何預先檢查。

然后編寫/運行腳本清理。

使用臨時表完成后,將其放在腳本的末尾。

所以無條件地運行

DROP TABLE #empDate

然后編寫/運行您的腳本,並確保在腳本的末尾有這一行。

使用object_id傳遞數據庫名稱

例如:

DECLARE @db_id int;
DECLARE @object_id int;
SET @db_id = DB_ID(N'AdventureWorks2012');
SET @object_id = OBJECT_ID(N'AdventureWorks2012.Person.Address');
IF @db_id IS NULL 
BEGIN;
PRINT N'Invalid database';
END;
ELSE IF @object_id IS NULL
BEGIN;
PRINT N'Invalid object';
END;
ELSE
BEGIN;
SELECT * FROM sys.dm_db_index_operational_stats(@db_id, @object_id, NULL, NULL);
END;
GO

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM