【问题标题】:tsql sql multiple temp tables with same nametsql sql 多个同名临时表
【发布时间】:2018-04-29 09:22:51
【问题描述】:

我正在使用 RDL 文件和存储过程编写报告。 RDL 文件名为 test.rdl,我有四 (4) 个存储过程连接到此 test.rdl 文件。所以这个文件将有四个数据集。

报告文件名:

test.rdl

存储过程名称:

  • sp_test_1
  • sp_test_2
  • sp_test_3
  • sp_test_4

每个存储过程都有同名的临时表 (#temp)。

create table #temp(
ID int,
Name varchar(max),
Location varchar(max)
)

insert into #temp

select * from anothertable where date between '20171001' and '20171031'

一些额外的查询以获得所需的结果,然后最终删除临时表。

select . . . . . . . . . .

drop table #temp

所以所有四个存储过程都有使用一个名称(#temp)的临时表。

所以我的问题是,当运行 RDL 测试文件并且同时调用所有四 (4) 个存储过程时,这是否可以正常工作? 我关心的是#temp 表,所有四个存储过程在运行结束时都有删除表#temp。这是否会影响运行时临时表的填充,因为其中一个存储过程可能会在另一个正在运行时以 drop table 完成,从而导致查询取消或以不完整的结果完成?

请解释一下。我希望这是一个有效的问题。

【问题讨论】:

标签: sql-server tsql stored-procedures reporting-services sql-server-2012


【解决方案1】:

一般来说.... 本地临时表(使用单个 #)仅可用于调用它们的过程的实例或从与创建临时表的过程相同的过程中调用的过程。

如果同时调用一个过程 10 次,每个过程都有它自己的临时表“副本”。

根据您的描述,听起来您只有 4 个数据集,每个数据集都运行一个存储过程,并且每个 SP 都会创建一个名为 #temp 的临时表。您没有调用其他 SP 的 SP...

假设这是正确的,那么它会正常工作,事实上你甚至不必在过程结束时删除临时表,因为这是自动完成的。

临时表都使用相同的名称引用这一事实并不重要,存储在数据库中的物理临时表的实际名称不会是#temp,而是更像tempdb.dbo.#temp_______________000000000123,重点是它们实际上都是数据库中唯一的表,但 SQL Server 会自动处理与您创建它的名称之间的转换。

【讨论】:

  • 感谢@Alan 的清晰解释。这清楚地解释了在多个存储过程中通常使用临时表。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-22
  • 2012-07-10
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多