我应该在这种情况下删除临时表吗?

时间:2014-04-18 06:21:15

标签: sql-server web-services azure sql-server-2012

我有一个在.Net webservice中调用的存储过程,其工作原理如下(伪代码):

CREATE PROC SomeProc AS
BEGIN TRY
BEGIN TRAN
    IF EXISTS (SELECT * FROM sys.tables WHERE name LIKE '#temp%')
        DROP TABLE #temp;

    CREATE TABLE #temp (...);
    /* lots of logic here */

    -- clear up
    IF EXISTS (SELECT * FROM sys.tables WHERE name LIKE '#temp%')
        DROP TABLE #temp;

COMMIT TRAN
END TRY

BEGIN CATCH
    IF EXISTS (SELECT * FROM sys.tables WHERE name LIKE '#temp%')
        DROP TABLE #temp;
    ROLLBACK TRAN;
END CATCH

始终通过与数据库相同的连接访问proc(如配置文件中所定义)。

有人提出了一个问题,即如果webservice,以及因此快速连续两次调用该过程,则存在第一次调用将删除第二次调用的临时表的危险。

这是对的吗?我认为SQL Server是同步的,因此无法同时调用两个过程,SQL会将请求排队吗? This post似乎暗示我做的是正确的事,但多线程的回答让我担忧。任何澄清都会有所帮助。

2 个答案:

答案 0 :(得分:1)

本地临时(#)表是会话范围的,其他会话无法干扰会话中创建的临时表。

如果在tempdb中对sys.tables进行选择,您将看到每个临时表都以会话标识符为后缀。

此外,无需在存储过程中明确删除临时表,SQL Server将执行自动清理,并缓存元数据以获得可能的性能优势。

答案 1 :(得分:0)

可以使用TRUNCATE TABLE

TRUNCATE TABLE #temp;