两个会话可以创建具有相同名称的#temp表吗?


17

我正在创建一个临时表(#myTable)并使用一个游标。当并发用户通过我的应用程序访问游标时,这是否会产生问题?它可以让我创建具有相同名称的单独的临时表吗?

以下是示例代码:

Open cursor;
Fetch Next from cursor into @Variable_Temp_Table_Name;
Create table #myTable(pk int)
While @@Fetch_Status = 0
Begin    
Fetch Next from cursor into @Variable_Temp_Table_Name;
End 

Answers:


20

SQL Server总是在临时表名称的末尾(在幕后)附加一些随机数,当并发用户在其会话中使用相同名称创建临时表时,SQL Server将在tempdb中创建多个临时表。

#TempTable在SSMS中的三个不同的会话中创建了3个临时表,现在,如果我转到tempdb,我可以看到在其中创建的临时表,其中在每个临时表的名称后附加了一个随机(唯一)字符串。

在此处输入图片说明


11

是的,多个应用程序将获得自己的#temp表副本。这就是使用#temp表的意义,因为每个并发会话都有自己的隔离对象。这与是否将游标与#temp表结合使用无关(尽管我怀疑仍然不需要游标-您没有包含足够的代码来特别注释)。

编辑以包含评论:

关于使用#temp表的另一件事是,如果需要向它们添加约束,则让SQL Server生成该名称,否则即使该表对于会话是唯一的,约束也不会,第二个实例将错误地创建该表。表。


7
关于使用#temp表的另一件事是,如果需要向它们添加约束,则让SQL Server生成该名称,否则即使该表对于会话是唯一的,约束也不会,第二个实例将错误地创建该表。表。
亚伦

1
@Aaron-建议您将对未命名约束的评论移到答案中。很多人搞砸了这个细节。
RLF 2015年

还要注意,如果有人确实想要全局临时表,则可以对其进行声明##likeThis
underscore_d

@RLF和Aaron:始终可以使用NEWID()生成GUID并通过Dynamic SQL创建约束。并不是说这和在CREATE TABLE语句中包括它一样干净,但这至少是一个选择。而且我还认为,临时表上不允许FK约束(只要我们一般地讲约束)。
所罗门·鲁兹基

@srutzky-正确,但是通常命名命名约束,以便于从代码中轻松引用它们。使用NEWID()不会提供这种简化,尽管您可以根据需要查询以找到NEWID。
RLF
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.