临时表已存在

时间:2017-04-25 08:17:18

标签: sql sql-server

您好我有一个临时表,我试图根据where条件插入记录,但它会抛出一个已经存在的错误。 我试图更改名称,但这不是问题,因为临时表在会话结束时被删除。

我认为我正在编写查询。

   SELECT [Name]
        INTO #TEMP_REJECT
        FROM #TEMP_VALIDATION
        WHERE Name = @Name

我正在尝试从#TEMP_VALIDATION

插入#TEMP_REJECT

错误消息

  

“数据库中已有一个名为'#TEMP_REJECT'的对象。”

请建议。

感谢您的帮助。 [R

4 个答案:

答案 0 :(得分:4)

这个答案将帮助您: official documentation

简而言之:INSERT INTO创建表格然后插入记录。 #TEMP_REJECT仅插入记录。

因此,在您的情况下,由于SELECT INTO已经存在,INSERT INTO会被拒绝,因为它无法再次创建表格,因此您必须在SELECT INTO之后使用IF OBJECT_ID('tempdb..#TEMP_REJECT') IS NOT NULL BEGIN INSERT INTO #TEMP_REJECT SELECT [Name] FROM #TEMP_VALIDATION WHERE Name = @Name END ELSE BEGIN SELECT [Name] INTO #TEMP_REJECT FROM #TEMP_VALIDATION WHERE Name = @Name END

import React from "react";
import ReacrDOM from "react-dom";
import {Router, Route, IndexRoute, hashHistory} from "react-router"
import {Provider} from "react-redux";

import store from "./store";
import Layout from "./pages/Layout";
import Dashboard from "./pages/Dashboard";
import Login from "./pages/login/index";
import User from "./pages/user/index";
import EnsureLoggedIn from "./EnsureLoggedIn";

const app = document.getElementById("app");

ReacrDOM.render(
    <Provider store={store}>
        <Router history={hashHistory}>
            <Route path="/login" component={Login}/>
            <Route component={EnsureLoggedIn}>
                <Route path="/" component={Layout}>
                    <IndexRoute component={Dashboard}/>
                    <Route path="user" component={User}/>
                </Route>
            </Route>
        </Router>
    </Provider>
    , app);

参考文献:
https://stackoverflow.com/a/8560644/3635715
INTO Clause

答案 1 :(得分:2)

如果表不存在,SQL Server将不会告诉您表。

我建议您添加

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

在您的select语句前面。这保证了执行select时临时表不存在。

所以你的陈述变成了

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

 SELECT [Name]
            INTO #TEMP_REJECT
            FROM #TEMP_VALIDATION
            WHERE Name = @Name

答案 2 :(得分:1)

在插入

之前尝试检查

如果object_id('tempdb ..#TEMP_REJECT')不为null 删除表#TEMP_REJECT

SELECT [Name]
        INTO #TEMP_REJECT
        FROM #TEMP_VALIDATION
        WHERE Name = @Name

如果SQL说有临时表,那么在插入之前必须有一个表

答案 3 :(得分:1)

我注意到在同一SQL Server选项卡/文件中连续工作时会遇到相同的错误。

例如,我有一个大型SQL文件,该文件用于使用临时表执行一系列更新。当我连续执行它时,它会错误地抱怨我的#tempTable已经存在(即使我使用DeanOC描述的“如果该表存在,也要删除它”语句)。

在连续运行之间退出文件/选项卡即可解决此问题。

如果这对您的用例造成了问题,建议您将语句捆绑到存储的proc中,并在其中实现DeanOC的放置逻辑。