存储过程中的临时表

The*_*ter 30 sql-server stored-procedures

我一直想知道sp中的临时表以及所有这些都会影响并发性.SP在MSSQL 08服务器上制作.

如果我有一个SP,我创建一个临时表并再次删除它:

BEGIN

CREATE TABLE #MyTempTable
(
   someField int,
   someFieldMore nvarchar(50)
)

... Use of temp table here
... And then..

DROP TABLE #MyTempTable

END
Run Code Online (Sandbox Code Playgroud)

这个SP会经常被调用,所以我的问题是这里是否会出现并发问题?

Meh*_*ari 31

不.将为每个连接创建临时表的独立实例.


blo*_*art 22

也许.

前缀为#(#example)的临时表基于每个会话保留.因此,如果您的代码在另一个调用运行时再次调用存储过程(例如后台线程),则create调用将失败,因为它已经存在.

如果你真的担心使用表变量

DECLARE @MyTempTable TABLE 
(
   someField int,
   someFieldMore nvarchar(50)
)
Run Code Online (Sandbox Code Playgroud)

这将特定于该存储过程调用的"实例".

  • 无论客户端尝试做什么,您都无法重用SQL会话. (2认同)
  • @ jp2code你可能已经想过,直到现在,但只是把它推出给其他人以后阅读.`表变量会自动删除,你不需要明确地执行它. (2认同)

Meh*_*ras 7

不是真的,我在谈论SQL Server.临时表(带有单个#)存在,并且在创建它的范围内可见(范围限制).每次调用存储过程时,它都会创建一个新范围,因此临时表仅存在于该范围内.我相信临时表对于在该范围内调用的存储过程和udf也是可见的.但是,如果您使用双磅(##),那么它们会在您的会话中变为全局,因此作为创建临时表的会话的一部分对其他正在执行的进程可见,您将不得不考虑是否可以访问临时表同时是否合乎需要.