如何在存储过程中删除临时表

时间:2020-06-02 07:32:26

标签: sql sql-server stored-procedures temp-tables

我正在使用SQL Server 2016 Service Pack 2,并使用以下代码。它可以在SQL查询语句中正确执行:

SELECT 'a' AS one INTO #deleted;
DROP TABLE IF EXISTS #deleted;
GO

SELECT 'b' AS two INTO #deleted;
DROP TABLE IF EXISTS #deleted;
GO

但是当我拿起 GO 时,我会遇到此错误:

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

My Code and Showed Error

如果要使用这种语法创建SP,则不能使用GO。

1 个答案:

答案 0 :(得分:2)

正确。如果要使用SELECT INTO语句和介于两者之间的DIE语句在同一批中使用它们,则必须给这两个临时表使用不同的名称。

或者,您可以先创建临时表,同时为两个SELECT语句提供所有必需的列,然后相应地调整SELECT(或与临时表数据一起运行的任何语句)。

例如

BEGIN
    DROP TABLE IF EXISTS #deleted ;
    CREATE TABLE #deleted ( [one] VARCHAR(5) NULL, [two] VARCHAR(5) NULL ) ;

    INSERT  INTO #deleted ( [one] )
    SELECT 'a' AS [one] ;

    INSERT  INTO #deleted ( [two] )
    SELECT  'b' AS [two] ;

    SELECT [one] FROM #deleted WHERE [two] IS NULL ;
    SELECT [two] FROM #deleted WHERE [one] IS NULL ;

    DROP TABLE IF EXISTS #deleted ;
END
GO

更新1
如前所述,您可以为临时表指定不同的名称。

例如

BEGIN
    SELECT  'a' AS [one]
    INTO    #deleted1 ;
    SELECT  * FROM #deleted1 ;  -- or whatever statements you need to execute
    DROP TABLE IF EXISTS #deleted1 ;

    SELECT  'b' AS [two]
    INTO    #deleted2 ;
    SELECT  * FROM #deleted2 ;  -- or whatever statements you need to execute
    DROP TABLE IF EXISTS #deleted2 ;
END
GO