2016-03-01 41 views
1

我有一个报告将触发SQL Server上的存储过程。报告需要几分钟才能运行。目前,在开发环境中使用我这种类型的代码正在写一对夫妇临时表:在开发环境处理多个用户同时创建临时表

SELECT * 
INTO #Temp1 
FROM MyTable 
WHERE MyVal = 'X' 

SELECT * 
INTO #Temp2 
FROM MyOtherTable 
WHERE MyOtherVal = 'Y' 

ETC... 

工作正常,但有一个轻微的可能性有一天两个人可能用两个不同的参数同时启动此功能。如果他们这样做,会导致一个#Temp被覆盖?如果是这样,处理这个问题的最好方法是什么?你能创建一个#Temp文件名基于时间戳或什么的?

+11

不,您创建的临时表的创建方式是特定于会话的。多个用户不会互相干扰。 – jradich1234

+2

如果临时表以#开头,则该用户特定。如果你在开始时给它一个##,那么它对所有用户都是全球的。 – PulseLab

+0

谢谢,伙计们!这些是自学成才的陷阱,但我一直在学习! –

回答

0

我第一次使用临时表,我想知道同样的事情。在SQL服务器上试试这个实验。在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服务器如何避免名称冲突。它实际创建的表具有类似于临时表名称的名称,但在末尾具有序列号,以避免名称冲突。它会自动为您处理。