【问题标题】:Handling multiple users creating temp tables simultaneously处理多个用户同时创建临时表
【发布时间】:2016-03-01 23:02:56
【问题描述】:

我有一份报告,它将触发 SQL Server 上的存储过程。运行报告需要几分钟时间。目前,在开发环境中,我正在使用这种类型的代码写入几个临时表:

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

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

ETC...

在开发环境中运行良好,但有轻微的可能性,有一天两个人可能会使用两个不同的参数同时启动它。如果他们这样做,会导致#Temp 被覆盖吗?如果是这样,处理它的最佳方法是什么?你能根据时间戳或其他东西创建一个#Temp 文件名吗?

【问题讨论】:

  • 不,以您显示的方式创建的临时表是特定于会话的。多个用户不会互相干扰。
  • 如果临时表以 # 开头,则它特定于该用户。如果你在一开始就给它一个##,那么它对所有用户都是全局的。
  • 谢谢,伙计们!这些是自学成才的陷阱,但我一直在学习!
  • 我担心如果您使用连接池,可能会导致一些问题,但似乎已经考虑过:stackoverflow.com/questions/141718/…

标签: sql-server


【解决方案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 为您避免名称冲突的方式。它实际创建的表的名称与您的临时表名称相似,但末尾有一个序列号,以避免名称冲突。它会自动为您处理。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-04-09
    • 2013-04-12
    • 1970-01-01
    • 2018-03-16
    • 2011-01-29
    • 2020-03-09
    • 2013-10-18
    • 2016-03-06
    相关资源
    最近更新 更多