我有一个报告会触发SQL Server上的存储过程。该报告需要几分钟才能运行。目前,在开发环境中,我正在使用这种类型的代码写入几个临时表:
SELECT *
INTO #Temp1
FROM MyTable
WHERE MyVal = 'X'
SELECT *
INTO #Temp2
FROM MyOtherTable
WHERE MyOtherVal = 'Y'
ETC...
在开发环境中正常工作,但有一个轻微的可能性,有一天两个人可能会同时用两个不同的参数启动它。如果他们这样做,会导致一个#Temp
被覆盖吗?如果是这样,最好的办法是什么?您可以根据时间戳或其他内容创建#Temp
文件名吗?
答案 0 :(得分:1)
我第一次使用临时表时,我想知道同样的事情。在SQL Server中尝试此实验。在SSMS中,运行每个查询并观察结果:
USE tempdb
GO
select * from sys.tables
SELECT * INTO #tablelist
FROM sys.tables
SELECT * INTO #tablelist2
FROM sys.tables
-- The results of these two are different
SELECT * FROM #tablelist
SELECT * FROM #tablelist2
查看第二个查询中的表列表。您会注意到两个名为#tablelist_______ ... ____00007
和#tablelist______ ... ____00008
的表
这就是SQL Server为您避免名称冲突的方式。它实际创建的表的名称与临时表名相似,但在末尾有一个序列号,以避免名称冲突。它会自动为您处理。