68

我在 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'的对象'。谁能告诉我为什么我会收到这个错误?

4

5 回答 5

89

您正在删除它,然后创建它,然后尝试使用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

于 2013-08-19T19:09:23.143 回答
44

我通常将这些行放在存储过程的开头,然后放在结尾。

这是对#temp 表的“存在”检查。

IF OBJECT_ID('tempdb..#MyCoolTempTable') IS NOT NULL
begin
        drop table #MyCoolTempTable
end

完整示例:

CREATE PROCEDURE [dbo].[uspTempTableSuperSafeExample]
AS
BEGIN
    SET NOCOUNT ON;


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


    CREATE TABLE #MyCoolTempTable (
        MyCoolTempTableKey INT IDENTITY(1,1),
        MyValue VARCHAR(128)
    )  

    INSERT INTO #MyCoolTempTable (MyValue)
        SELECT LEFT(@@VERSION, 128)
        UNION ALL SELECT TOP 10 LEFT(name, 128) from sysobjects

    SELECT MyCoolTempTableKey, MyValue FROM #MyCoolTempTable


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


    SET NOCOUNT OFF;
END
GO
于 2013-08-19T21:14:08.707 回答
8

您必须像这样修改查询

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 into 因为如果您将来使用 insert into 那么如果您想通过添加一个新列来修改临时表,该列可以在某些过程之后填充(而不是与 insert 一起)。那时,您需要以相同的方式对其进行返工和设计。

使用表变量http://odetocode.com/articles/365.aspx

declare @userData TABLE(
 LAST_NAME NVARCHAR(30),
    FRST_NAME NVARCHAR(30)
)

优点 不需要 Drop 语句,因为这类似于变量。范围在执行后立即结束。

于 2013-08-19T19:21:52.313 回答
2

有时您可能会犯一些愚蠢的错误,例如在同一个 .sql 文件(在同一个工作区/选项卡中)上编写插入查询,因此一旦执行插入查询,其中创建查询刚刚在上面编写并已执行,它将再次开始执行使用插入查询。

这就是我们获取对象名称(表名称)已经存在的原因,因为它是第二次执行。

因此,请转到单独的选项卡以编写插入或删除或您将要执行的任何查询。

或者在同一工作区中的所有查询之前使用注释行,例如

CREATE -- …
-- Insert query
INSERT INTO -- …
于 2014-12-22T07:05:20.227 回答
-1

在 Azure 数据仓库中,有时也会发生这种情况,因为为用户会话创建了临时表。我通过重新连接数据库解决了同样的问题,

于 2019-01-15T08:36:32.507 回答