在存储过程中使用两个 insert into 语句

时间:2021-05-16 11:41:50

标签: sql sql-server tsql sql-insert

我尝试在一个存储过程中使用两个 insert into 语句,如下所示:

CREATE PROCEDURE dbo.test
  
AS
BEGIN
    DROP TABLE IF EXISTS #temp;

    SELECT *
    INTO #temp
    FROM sys.column_master_keys AS CMK;

    -- some statement
    -- some statement
    -- some statement

    DROP TABLE IF EXISTS #temp;

    SELECT *
    INTO #temp
    FROM INFORMATION_SCHEMA.COLUMNS AS C;
END;

错误信息:

<块引用>

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

如何在一个存储过程中使用一张临时表进行多次插入?

2 个答案:

答案 0 :(得分:1)

发生这种情况是因为代码在运行之前被编译。在编译阶段,SQL Server 会看到创建表的两个 INSERT 语句。它不会执行它们,因为它只是设计执行计划。

因为代码没有被执行,编译阶段错过了DROP TABLE。唉。执行第二个时发现该表已经存在,产生错误。

在任何情况下,通过为表格指定不同的名称,这很容易解决。

答案 1 :(得分:1)

您可以在一个存储过程中使用一个临时表来执行多个 insert into 语句。
要实现这一点,您必须使用动态 SQL。

CREATE PROCEDURE dbo.test
  
AS
BEGIN
    DROP TABLE IF EXISTS #temp;

    EXEC('SELECT *
    INTO #temp
    FROM sys.column_master_keys AS CMK;')

    -- some statement
    -- some statement
    -- some statement

    DROP TABLE IF EXISTS #temp;

    EXEC('SELECT *
    INTO #temp
    FROM INFORMATION_SCHEMA.COLUMNS AS C;')
END;
相关问题