[英]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值為正。 我也嘗試過:
blat
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_id
在tempdb.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.