tsql sql具有相同名称的多个临时表

时间:2017-11-16 00:14:26

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

我正在使用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表,所有四个存储过程在运行结束时都有drop table #temp。这会影响运行时临时表的填充,因为其中一个存储过程可能会使用drop table,而另一个正在运行,从而导致取消查询或完成不完整的结果?

有些人可以解释一下。我希望这是一个有效的问题。

1 个答案:

答案 0 :(得分:4)

从广义上讲...... 本地临时表(使用单个#)仅可用于调用它们的过程或从与创建临时表的过程相同的过程调用的过程。

从您的描述中,您可能只有4个数据集,每个数据集都运行一个存储过程,每个SP都会创建一个名为#temp的临时表。你没有调用其他SP的SP ......

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

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