在SQL Server中异步创建临时表

时间:2019-05-06 18:17:46

标签: sql sql-server asynchronous

我目前正在尝试确定从Web应用程序创建临时表的可能问题,以及SQL Server如何自然确定单独的会话。

SELECT blabla, lala FROM table INTO #TempTable
SELECT blabla FROM #TempTable
DROP TABLE #TempTable

在上面,当Web应用程序的一个用户正在等待第二行执行,而另一用户触发了相同的3行时,将确定第二个用户是否获得“对象已存在”或为该用户创建了新的#TempTable。

如果每个用户都位于同一网络上的单独计算机上,SQL Server会将其视为单独的会话,从而创建单独的临时表。

如果它在两个不同网络上的同一台计算机上运行怎么办?

2 个答案:

答案 0 :(得分:1)

每个与数据库的用户连接都是它自己的会话。即使您在SQL Server中使用连接池,这些会话也是唯一的。在后台,SQL Server在每个#tempTable后面附加一个单一的会话引用号,因此从技术上讲,它们在执行期间甚至没有被命名为同一事物。

如果问题的根源是有关调试时已经存在的对象的错误消息。在创建临时表之前,尝试添加以下代码片段:

IF OBJECT_ID('[tempdb]..[#tempTable]') IS NOT NULL
BEGIN
    DROP TABLE #tempTable
END

答案 1 :(得分:0)

SQL Server无法确定单独的会话。
它是创建会话的客户端应用程序。您可以编写一个应用程序,其中所有到数据库的流量都使用单个连接(不是那么容易),或者为每个页面创建一个单独的连接(常见错误)。两种解决方案都非常糟糕。
在适当的设计中,应使用连接池,并且代码应根据需要从连接池中保留连接。
即使您正在使用连接池,也有可能在与该池不同的连接上执行每个命令。