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)
“我无法同时运行此过程的多个实例。为什么?”
您能否澄清“无法运行”的含义?你有错误吗?
现在,您不需要使用 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
归档时间: |
|
查看次数: |
4392 次 |
最近记录: |