过程的多个实例可以同时创建相同的 #Temp 吗?

RIS*_*YAL 1 sql-server stored-procedures tempdb temporary-tables

我有一个将数据插入#temp 表的过程。对数据执行某些操作后,它将数据从#temp 表存储到其他表。

我无法同时运行此过程的多个实例。为什么?我们在多个选项卡中创建具有相同名称的 #temp 表。那么为什么我们不能对临时表的多个实例做同样的事情呢?

任何解决方案?

例子:

--exec dbo.testing_temp_table
CREATE PROCEDURE [dbo].[testing_temp_table]
AS
BEGIN

    SET NOCOUNT ON;

    -- Insert statements for procedure here
    IF OBJECT_ID('tempdb..#temp_1') IS NOT NULL drop table #temp_1
    select  * into #temp_1 from dbo.Emp

END
Run Code Online (Sandbox Code Playgroud)

SQL*_*tor 6

“我无法同时运行此过程的多个实例。为什么?”

您能否澄清“无法运行”的含义?你有错误吗?

现在,您不需要使用 IF OBJECT_ID() 东西检查存储过程中表的存在。

SQL Server 将为存储过程的每个实例创建一个临时表的实例,并且它仅对创建范围(在本例中为存储过程)和内部范围可见,例如如果您调用另一个子程序中的代码。一旦该过程完成,临时表将消失。

在幕后,查询处理器为每个实例将一些唯一的字符串附加到 TempDB 中的表名。

BOL 包含所有详细信息:CREATE TABLE (Transact-SQL)

--响应关于生成相同后缀的存储过程的 OP 评论。——

您在这里没有给予 SQL Server 足够的信任。如果您的说法属实,这将是一个重大错误;完全支持执行使用临时表的存储过程的多个实例。

我怀疑您是在单个连接上测试它,并且在重新执行相同的 proc 时看到它,您会得到相同的后缀。这是对同一会话中重复执行重复使用后缀的优化。

你应该测试的是:

CREATE PROCEDURE P 
AS
BEGIN
CREATE TABLE #T(Col1 INT);
WAITFOR DELAY '00:00:10';
SELECT * FROM TempDB.sys.tables;
END
Run Code Online (Sandbox Code Playgroud)

然后在两个或多个连接上,并发执行

EXEC P
Run Code Online (Sandbox Code Playgroud)

这是我遇到的事情:

姓名
#T_____________000000000004
#T_____________000000000005

HTH