我有一个在.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似乎暗示我做的是正确的事,但多线程的回答让我担忧。任何澄清都会有所帮助。
答案 0 :(得分:1)
本地临时(#)表是会话范围的,其他会话无法干扰会话中创建的临时表。
如果在tempdb中对sys.tables进行选择,您将看到每个临时表都以会话标识符为后缀。
此外,无需在存储过程中明确删除临时表,SQL Server将执行自动清理,并缓存元数据以获得可能的性能优势。
答案 1 :(得分:0)
可以使用TRUNCATE TABLE。
TRUNCATE TABLE #temp;