簡體   English   中英

如何正確檢查SQL Server 2005中是否存在臨時表?

[英]How to check correctly if a temporary table exists in SQL Server 2005?

我有一個查詢,我從表中插入一些值:

SELECT ID, NAME INTO #tmpTable1
FROM TableOriginal

首次執行沒問題,如果我在MSSMS(Microsoft Sql Server Management Studio)中按F5(運行),則會發生錯誤:

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

好。 我決定在使用以下方法將TableOriginal數據插入#tmpTable1之前進行檢查:

IF OBJECT_ID('tempdb.#tmpTable1') IS NOT NULL  
  DROP TABLE #tmpTable1

不工作,錯誤再次顯示如上。

我在tempdb數據庫中看到了以下臨時表名:

dbo.#tmpTable1__________________0000007

為什么? 每次創建臨時表(使用第一個查詢)時,表名都將在MSSMS中自動生成?

如何刪除現有臨時表以使用新值執行新表?

你很近 - 你需要在支票中使用兩個點:

IF OBJECT_ID('tempdb..#tmpTable1') IS NOT NULL  
                    ** 
                    |
                  use two dots here!

基本上,這是說: 檢查tempDB ,我不關心表中的模式

正如Joe所說:這不是100%正確:它不會檢查每個模式 - 它只會檢查默認所有者的模式 - 通常是dbo 所以這也可行:

IF OBJECT_ID('tempdb.dbo.#tmpTable1') IS NOT NULL  

如果您碰巧在默認所有者以外的架構中創建對象,則需要明確指定您所指的架構。 但是tempDB中的臨時表確實是在dbo模式中創建的。

這不是問題的答案,只是想暫時發布關於.dbo. vs. ..引用#temp表時。

我找不到讓#temp表實際上由除dbo以外的任何東西所擁有的方法。 試試吧:

CREATE SCHEMA blat;
GO

CREATE TABLE blat.#pound(id INT);
GO

SELECT 
   OBJECT_ID('tempdb..#pound'), 
   OBJECT_ID('tempdb.dbo.#pound'), 
   OBJECT_ID('tempdb.blat.#pound');

USE tempdb;
GO

SELECT [object_id], SCHEMA_NAME([schema_id]) 
  FROM sys.objects 
  WHERE name LIKE '#pound%';

結果:

-1222354987    -1222354987    -1222354987

-1222354987    dbo

這是在SQL Server 2012上。我在SQL Server 2005上進行了測試,唯一的區別是object_id值為正。 我也嘗試過:

  • 實際存在於tempdb中的模式,稱為blat
  • table blat.#pound由默認架構為blat的用戶創建
  • 以上都是

在所有三種情況下,都獲得了與上述相同的結果。

您也不能在不同的模式中創建兩個具有相同名稱的#temp表:

CREATE TABLE blat.#flab(id INT);
CREATE TABLE dbo.#flab(id INT);

結果:

Msg 2714,Level 16,State 6
數據庫中已經有一個名為'#flab'的對象。

這不是解析問題(就像許多#temp表問題一樣); 您可以單獨運行這兩個語句並收到相同的錯誤。

所以,這是一個冗長的說法,你不需要在解析#temp表名時指定模式,它總是在dbo下創建,至少在OBJECT_ID下的解析將忽略你指定的模式( OBJECT_SCHEMA_NAME在#tempdb的上下文中運行時也總是返回dbo ,但在任何其他數據庫中都沒有。 所有的賭注都關閉,如果你嘗試查詢schema_idtempdb.sys.objects

CREATE TABLE #temptable (col1 int);
GO
INSERT INTO #temptable
VALUES (10);
GO
SELECT * FROM #temptable;
GO
IF OBJECT_ID(N'tempdb..#temptable', N'U') IS NOT NULL 
DROP TABLE #temptable;
GO
--Test the drop.
SELECT * FROM #temptable;

只要創建它的連接打開,就會存在以這種方式定義的臨時表。 通常不需要檢查它是否存在或者手動丟棄它,因為你在連接中有完全的控制權,但如果你真的需要檢查它,你可以檢查tempdb.dbo。#tempTable。

IF OBJECT_ID('tempdb.dbo。#tmpTable1%')IS NOT NULL :)

暫無
暫無

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

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