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

Sql 在存储过程中使用两个insert into语句,sql,sql-server,tsql,sql-insert,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

我尝试在一个存储过程中使用两个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”的对象


如何在一个存储过程中为多个insert into使用一个临时表?

之所以会出现这种情况,是因为代码在运行之前已编译。在编译阶段,SQL Server会看到创建表的两条
INSERT
语句。它并没有执行它们,因为它只是在设计执行计划

由于没有执行代码,编译阶段将错过
下拉表
。唉。当执行第二个表时,它会看到该表已经存在,从而生成错误


在任何情况下,都可以通过给表指定不同的名称来很容易地解决这个问题。

这是因为代码是在运行之前编译的。在编译阶段,SQL Server会看到创建表的两条
INSERT
语句。它并没有执行它们,因为它只是在设计执行计划

由于没有执行代码,编译阶段将错过
下拉表
。唉。当执行第二个表时,它会看到该表已经存在,从而生成错误


在任何情况下,都可以通过给表指定不同的名称来很容易地解决这一问题。

您可以在一个存储过程中为多个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;

您可以在一个存储过程中使用一个临时表来执行多个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;

这不是一个临时表,它是一个临时表;时态表是一种非常不同类型的表,它不是时态表,而是临时表;时态表是一种非常不同类型的表。哇!太好了。在这个解决方案中,我们不需要DROP TABLE命令,因为该命令在其他批处理中运行。@Amirhossein。如果确实要引用临时表(),则此操作不起作用。坚持使用不同的名字。这是最简单的解决方案。@GordonLinoff是的Gordon,我更改了它,我通过一个动态SP使用此解决方案,该SP具有out put和嵌套调用SPs,在此SP中可以输入任何名称和字符串,并返回out put结果。我需要这个tSqlt框架的解决方案。我需要一个在最终日志中断言测试结果的唯一名称。它更干净,然后为美国团队中的其他开发人员更改读取日志的名称。非常感谢您的深入回答和支持。我很惊讶您接受了一个答案,而这个答案在创建临时表之后显然不起作用。@GordonLinoff我打错了电话。我误以为我找到了一个很好的解决办法。但这是错误的。你是对的,这不是真正的解决办法。这是不可能的。哇!太好了。在这个解决方案中,我们不需要DROP TABLE命令,因为该命令在其他批处理中运行。@Amirhossein。如果确实要引用临时表(),则此操作不起作用。坚持使用不同的名字。这是最简单的解决方案。@GordonLinoff是的Gordon,我更改了它,我通过一个动态SP使用此解决方案,该SP具有out put和嵌套调用SPs,在此SP中可以输入任何名称和字符串,并返回out put结果。我需要这个tSqlt框架的解决方案。我需要一个在最终日志中断言测试结果的唯一名称。它更干净,然后为美国团队中的其他开发人员更改读取日志的名称。非常感谢您的深入回答和支持。我很惊讶您接受了一个答案,而这个答案在创建临时表之后显然不起作用。@GordonLinoff我打错了电话。我误以为我找到了一个很好的解决办法。但这是错误的。你是对的,这不是真正的解决办法。这是不可能的。