Sql 在存储过程中使用两个insert into语句
我尝试在一个存储过程中使用两个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
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我打错了电话。我误以为我找到了一个很好的解决办法。但这是错误的。你是对的,这不是真正的解决办法。这是不可能的。