2010-11-19 92 views
0

消息2714,级别16,状态1,过程QOTD,行12数据库中已有一个名为'#tmpID3'的对象。获取“在创建临时表时已有名为”的对象

ALTER PROCEDURE QOTD (@source INT) AS 
BEGIN 
    IF @source = 1 
    SELECT ID INTO #tmpID3 FROM tbl1 
    ELSE 
    SELECT ID INTO #tmpID3 FROM tbl2 

    SELECT ID FROM #tmpID3 

    DROP TABLE #tmpID3 
END 

消息2714,级别16,状态1,过程QOTD,7号线已经有一个数据库名为 '#tmpID3' 的对象。 - jesvin 11月19日在5:37

同时加入这个我得到的错误

+2

这是在黑暗中拍摄的全部照片,但我猜测*数据库中已经有一个名为'#tmpID3'的对象。 – cdhowie 2010-11-19 05:13:47

+0

ALTER PROCEDURE QOTD(@source INT) AS BEGIN IF @source = 1 SELECT ID INTO#tmpID3 FROM TBL1 ELSE SELECT ID INTO#tmpID3 FROM TBL2 SELECT ID FROM#tmpID3 DROP TABLE#tmpID3 END – jesvin 2010-11-19 05:37:37

+0

消息2714,级别16,状态1,过程QOTD,行7 数据库中已有一个名为'#tmpID3'的对象。 – jesvin 2010-11-19 05:37:45

回答

0

它已经存在。如果您将此表创建为定期运行的脚本的一部分,请在开始时添加DROP TABLE#tmpID3。

临时表是单线程的(即服务器在创建时不能做其他事情)。如果您经常使用它,请考虑表变量。

+0

ALTER PROCEDURE QOTD(@source INT) AS BEGIN IF @source = 1 SELECT ID INTO#tmpID3 FROM TBL1 ELSE SELECT ID INTO#tmpID3 FROM TBL2 SELECT ID FROM#tmpID3 DROP TABLE#tmpID3 END – jesvin 2010-11-19 05:31:52

+0

我的错误是在插入它时没有创建临时表错误而出现 – jesvin 2010-11-19 05:32:26

0

启动程序QOTD有:

Drop Table #tmpID3 
+0

这个drop正在工作,但在创建sp时这将再次显示此错误... – jesvin 2010-11-19 05:28:30

+0

而运行,甚至没有创建临时表误差表示 – jesvin 2010-11-19 05:29:34

+0

ALTER PROCEDURE QOTD(@source INT) AS BEGIN IF @source = 1 SELECT ID INTO#tmpID3 FROM TBL1 ELSE SELECT ID INTO#tmpID3 FROM TBL2 SELECT ID FROM#tmpID3 DROP TABLE#tmpID3 END – jesvin 2010-11-19 05:29:34

0

看一看Check If Temporary Table Exists

编辑如何检查临时表,并把它,如果它存在

IF OBJECT_ID('tempdb..#TEMP') IS NOT NULL 
BEGIN 
    DROP TABLE #TEMP 
END 

编辑2看起来2个select into是相互冲突的。尽管在手工作之前创建表格。喜欢的东西

ALTER PROCEDURE QOTD (@source INT) 
AS 
BEGIN 
    IF OBJECT_ID('tempdb..#tmpID3') IS NOT NULL 
    BEGIN 
     DROP TABLE #tmpID3 
    END 
    CREATE TABLE #tmpID3(
      ID INT 
    ) 
    IF @source = 1 
    BEGIN 
     INSERT INTO #tmpID3 SELECT ID FROM tbl1 
    END 
    ELSE 
    BEGIN 
     INSERT INTO #tmpID3 SELECT ID FROM tbl2 
    END 
    SELECT ID FROM #tmpID3 
    DROP TABLE #tmpID3 
END 

编辑3临时表是不是在这种情况下需要。如果会做

喜欢的东西

ALTER PROCEDURE QOTD (@source INT) 
AS 
BEGIN 
    IF @source = 1 
    BEGIN 
     SELECT ID FROM tbl1 
    END 
    ELSE 
    BEGIN 
     SELECT ID FROM tbl2 
    END 
END 
+0

ALTER PROCEDURE QOTD(@source INT) AS BEGIN IF @source = 1 SELECT ID INTO#tmpID3 FROM TBL1 ELSE SELECT ID INTO#tmpID3 FROM tbl2的 SELECT ID FROM#tmpID3 DROP TABLE#tmpID3 END – jesvin 2010-11-19 05:30:47

+0

的问题是在这里甚至没有创造它显示消息2714,级别16,状态1,过程QOTD一个临时表,11号线 数据库中已经有一个名为'#tmpID3'的对象。 – jesvin 2010-11-19 05:31:24

+0

这很好,所以通过检查它是否存在来启动该过程,如果它存在,则放弃它。 – 2010-11-19 05:34:16

0

。一个简单得有跨数据库唯一的名称。 SQL Server处理临时表名称的唯一性。但是,如果存在补充对象(如单独创建的主键),那么当两个用户同时尝试创建表时可能会发生冲突。

您引用的错误消息中有一个名称中带有ID的对象,所以我猜这就是您发现自己的情况。Andy Novick已经写了一个关于此主题的注释,解释了为什么会发生并给一对夫妇的解决方法。 Check it out

2

您正在看到一个解析器尝试创建您的过程时出错。临时表尚不存在,但解析器认为它确实存在。

看一看我回答这个问题:There is already an object named '#columntable' in the database.

我本来以为,正如其他人谁已经回答了你的问题,因为你没有明确的下降临时表,在结束时,你会得到这个错误你的程序。

本地临时表是自动在程序结束时删除在 创建它们的在我的SQL

所以我试图创建过程:但是,如crokusek先在他的评论中指出, Server 2008实例并得到相同的错误。

更改程序以使用不同的临时表名称,如下所示,避免了问题证明临时表在过程结束后被丢弃。

CREATE TABLE tbl1 (ID INT) 
GO 
CREATE TABLE tbl2 (ID INT) 
GO 
INSERT INTO tbl1(ID) VALUES (1),(2),(3) 
INSERT INTO tbl2(ID) VALUES (4),(5),(6) 
GO 
CREATE PROCEDURE QOTD (@source INT) 
AS 
    SET NOCOUNT ON 
    BEGIN 
     IF @source = 1 
      BEGIN 
       SELECT ID INTO #tmpID13 FROM tbl1 
       SELECT ID FROM #tmpID13 
      END 
     ELSE 
      BEGIN 
       SELECT ID INTO #tmpID23 FROM tbl2 
       SELECT ID FROM #tmpID23 
      END 
    END 
GO 
EXEC QOTD 1 
EXEC QOTD 2 

输出:

ID 
----------- 
1 
2 
3 

ID 
----------- 
4 
5 
6 
+0

答案的第一部分不是真实的(本地临时表在创建它们的过程结束时会自动删除),因此如果它称为多个倍。你的答案的第二部分是真实的 - 这是一个解析器错误,有时候当SP中有多个选项时会发生。您的参考适用于相关问题,但不涉及SP。 – crokusek 2013-10-01 21:07:12

+0

@crokusek - 你能否提供一个关于你声称“本地临时表在自动创建过程结束时自动删除”的文档参考?我了解临时表在删除创建数据库的_connection_时被删除。 – Tony 2013-10-01 21:13:33

+0

仅在会话级创建的临时表是会话绑定的。所有其他临时表都绑定到创建它们的批处理(存储过程或其他可编译单元)。使用SSMS往往会造成混淆,因为这是临时表在会话级创建的唯一常见方式。 – RBarryYoung 2013-10-01 22:41:42

0

我有完全一样的问题,请参阅我的答案在这里:
There is already an object named '#columntable' in the database

在这种情况下,解决方案似乎是先创建表,然后加入行。这样解析器不会发出抱怨(因为这是一个known parser issue)。

ALTER PROCEDURE QOTD (@source INT) AS 
BEGIN 
    -- Create the table without having to declare any column types or sizes 
    SELECT TOP 0 ID INTO #tmpID3 FROM tbl1 

    -- Prevent IDENTITY_INSERT error 
    SET IDENTITY_INSERT #tmpID3 ON 

    -- Add the actual rows required 
    IF @source = 1 
    INSERT INTO INTO #tmpID3 (ID) SELECT ID FROM tbl1 
    ELSE 
    INSERT INTO INTO #tmpID3 (ID) SELECT ID FROM tbl2 

    SET IDENTITY_INSERT #tmpID3 OFF 

    SELECT ID FROM #tmpID3 

    DROP TABLE #tmpID3 
END