我在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'的对象'。谁能告诉我为什么会收到这个错误?
答案 0 :(得分:61)
您正在删除它,然后创建它,然后尝试使用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
语句的表
答案 1 :(得分:29)
我通常把这些行放在我的存储过程的开头,然后放在最后。
这是#temp表的“存在”检查。
IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
begin
drop table #MyCoolTempTable
end
答案 2 :(得分:6)
您必须像这样修改查询
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,那么可以在一些进程之后填充(而不是与insert一起填充)。那时,你需要以同样的方式进行返工和设计。
使用表变量http://odetocode.com/articles/365.aspx
declare @userData TABLE(
LAST_NAME NVARCHAR(30),
FRST_NAME NVARCHAR(30)
)
<强>优点强> 不需要Drop语句,因为这与变量类似。范围在执行后立即结束。
答案 3 :(得分:3)
有时你可能会犯同样的.sql文件(在同一个工作区/标签中)编写插入查询这样的愚蠢错误,所以一旦你执行了插入查询,你的创建查询就在上面编写并且已经执行了,它将再次出现开始执行插入查询。
这就是为什么我们已经获得对象名称(表名)的原因,因为它已经第二次执行了。
因此,请转到单独的选项卡以编写插入或删除或您要执行的任何查询。
或者在同一工作区中的所有查询之前使用注释行,如
CREATE -- …
-- Insert query
INSERT INTO -- …
答案 4 :(得分:0)
在Azure数据仓库中有时也会发生这种情况,因为为用户会话创建了临时表。通过重新连接数据库,我也解决了相同的问题,