在存储过程中使用两个 insert into 语句
Use two insert into statements in a stored procedure
我尝试在一个存储过程中使用两个 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;
错误信息:
There is already an object named '#temp' in the database.
如何在一个存储过程中使用一个临时 table 插入多个?
发生这种情况是因为代码在 运行 之前 已编译 。在编译阶段,SQL 服务器看到创建 table 的两个 INSERT
语句。它不会执行它们,因为它只是设计执行计划。
因为代码没有被执行,编译阶段错过了DROP TABLE
。唉。它看到 table 在执行第二个时已经存在,从而产生错误。
无论如何,通过给 table 不同的名字很容易解决这个问题。
您可以对一个存储过程中的多个插入语句使用一个临时 table。
要实现这一点,您必须使用动态 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 语句,如下所示:
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;
错误信息:
There is already an object named '#temp' in the database.
如何在一个存储过程中使用一个临时 table 插入多个?
发生这种情况是因为代码在 运行 之前 已编译 。在编译阶段,SQL 服务器看到创建 table 的两个 INSERT
语句。它不会执行它们,因为它只是设计执行计划。
因为代码没有被执行,编译阶段错过了DROP TABLE
。唉。它看到 table 在执行第二个时已经存在,从而产生错误。
无论如何,通过给 table 不同的名字很容易解决这个问题。
您可以对一个存储过程中的多个插入语句使用一个临时 table。
要实现这一点,您必须使用动态 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;