Pau*_*ens 7 sql sql-server sql-server-2005
我正在运行这样的SELECT INTO
语句,所以我可以在最终删除表之前操作数据.
SELECT colA, colB, colC INTO #preop FROM tblRANDOM
Run Code Online (Sandbox Code Playgroud)
但是,当我运行该语句然后,在不删除新创建的表的情况下,然后我运行以下任一语句,找不到表?即使通过对象浏览器扫描我也看不到它.我应该在哪里看?
SELECT [name] FROM sysobjects WHERE [name] = N'#preop'
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_NAME = '#preop'
Run Code Online (Sandbox Code Playgroud)
Aar*_*and 18
临时表不存储在本地数据库中,它们存储在其中tempdb
.他们的名字也不是你的名字; 它有一个十六进制代码后缀和一堆下划线来消除会话之间的歧义.你应该使用sys.objects
or sys.tables
,而不是弃用sysobjects
(注意顶部的大警告),或者不完整和陈旧的INFORMATION_SCHEMA
视图.
SELECT name FROM tempdb.sys.objects WHERE name LIKE N'#preop[_]%';
Run Code Online (Sandbox Code Playgroud)
如果您正在尝试确定会话中是否存在此类对象,那么您应该知道是否应该首先删除它,您应该:
IF OBJECT_ID('tempdb.dbo.#preop') IS NOT NULL
BEGIN
DROP TABLE #preop;
END
Run Code Online (Sandbox Code Playgroud)
但是,如果此代码在存储过程中,那么实际上不需要这样做......当存储过程超出范围时,应该自动删除该表.
tempdb
我更愿意以这样的方式查询:
IF EXISTS (SELECT * FROM tempdb.sys.objects
WHERE object_id = OBJECT_ID(N'tempdb.[dbo].[#MyProcedure]')
AND type in (N'P', N'PC'))
BEGIN
print 'dropping [dbo].[#MyProcedure]'
DROP PROCEDURE [dbo].[#MyProcedure]
END
GO
Run Code Online (Sandbox Code Playgroud)