【发布时间】:2014-04-16 13:30:18
【问题描述】:
我正在存储过程中创建一个临时表。我知道它们会为每个会话创建和销毁,但是有些不清楚。假设两个用户访问我调用创建临时表的存储过程的网页,当两个用户创建 same 临时表时会不会发生冲突?
谢谢
【问题讨论】:
-
谢谢,那篇文章读起来很不错!
标签: sql-server tsql stored-procedures temp-tables
我正在存储过程中创建一个临时表。我知道它们会为每个会话创建和销毁,但是有些不清楚。假设两个用户访问我调用创建临时表的存储过程的网页,当两个用户创建 same 临时表时会不会发生冲突?
谢谢
【问题讨论】:
标签: sql-server tsql stored-procedures temp-tables
如果您创建本地临时表(如#temp),则没有问题。但是,其他会话可以访问全局临时表(##Temp),因此除非别无选择,否则我从不使用它们。来自在线书籍:
本地临时表仅对其创建者可见 与表时相同的 SQL Server 实例连接 首次创建或引用。本地临时表被删除后 用户断开与 SQL Server 实例的连接。全局临时 表对任何用户和任何连接都是可见的 创建,并在所有引用该表的用户时被删除 断开与 SQL Server 实例的连接。
【讨论】:
每个 SQL 连接都会创建临时表,因此调用相同存储过程的两个用户将创建相关表的单独实例。
证明这一点的最简单方法是在 2 个单独的查询窗口中运行以下查询:
select 1 as someid
into #temp
每个窗口都有自己的连接,因此会创建一个唯一的临时表。
如果您查看System Databases > TempDB > Temporary Tables(您可能需要刷新表格列表),您将看到 2 个唯一命名的表格,类似于:
#temp________xxx1
#temp________xxx2
如果您随后关闭其中一个查询窗口并刷新临时表列表,您将看到一个表已被删除。
【讨论】: