我有一个##表,可以在所有会话中访问,但有时我会收到错误
已经有一个名为的对象 数据库中的'## table'。
为什么以及如何解决它。
答案 0 :(得分:5)
找到一个有趣的参考here:
全局临时表的运行方式与本地临时表非常相似;它们是在tempdb中创建的,与永久表相比,锁定和日志记录更少。但是,它们对所有会话都可见,直到创建会话超出范围(并且全局## temp表不再被其他会话引用)。如果两个不同的会话尝试上述代码,如果第一个仍处于活动状态,则第二个会话将收到以下内容:
服务器:Msg 2714,Level 16,State 6,Line 1 数据库中已经有一个名为“## people”的对象。
我还没有看到使用全局##临时表的有效理由。如果数据需要持久化到多个用户,那么至少对我来说使用永久表会更有意义。您可以通过在自动启动过程中创建全局##临时表来使其更加永久,但我仍然无法看到它对永久表的优势。使用永久表,您可以拒绝权限;您不能拒绝来自全局## temp表的用户。
答案 1 :(得分:3)
There is already an object named '##table' in the database.
如果您正在执行CREATE Table语句,通常会因为数据库中已存在“## table”而失败,您通常会收到此错误。
在我看来,可能在代码中的某个时刻,再次调用此全局表的CREATE TABLE逻辑会导致此错误。
是否有导致此错误的确切语句的详细信息?
答案 2 :(得分:3)
所以WHY部分已经得到解答,以下是如何解决它:
在创建临时表之前检查是否存在临时表:
if object_id('tempdb..##table') is null begin
--create table ##table...
end
我发现了一篇非常有趣的帖子,关于如何通过Google搜索http://sqlservercodebook.blogspot.com/2008/03/check-if-temporary-table-exists.html
检查临时表的存在