简短的回答是:
每个查询都保证了临时表的隔离,并且在线程、锁或并发访问方面没有什么可担心的。
我不确定为什么这里的答案谈论“连接”和线程的重要性,因为它们是编程概念,而查询隔离是在数据库级别处理的。
本地临时对象在 SQL Server 中由Session分隔。如果您有两个查询同时运行,那么它们是两个完全独立的会话,不会相互干扰。登录无关紧要,例如,如果您使用 ADO.NET 使用单个连接字符串(这意味着多个并发查询将使用相同的 SQL 服务器“登录”),您的查询仍将在单独的会话中运行。连接池也无关紧要。本地临时对象(表和存储过程)完全不会被其他会话看到。
澄清这是如何工作的;虽然您的代码对本地临时对象有一个单一的通用名称,但 SQL Server 会为每个会话的每个对象附加一个唯一的字符串,以使它们分开。您可以通过在 SSMS 中运行以下命令来查看:
CREATE TABLE #T (Col1 INT)
SELECT * FROM tempdb.sys.tables WHERE [name] LIKE N'#T%';
您将看到类似于以下名称的内容:
T_______________00000000001F
然后,在不关闭该查询选项卡的情况下,打开一个新的查询选项卡并粘贴相同的查询并再次运行它。您现在应该看到如下内容:
T_______________00000000001F
T_______________000000000020
因此,每次您的代码引用#T 时,SQL Server 都会根据会话将其转换为正确的名称。分离都是自动处理的。