SQL Temp Table仅限于Proc

时间:2016-09-21 11:05:00

标签: sql sql-server

我需要创建一个表,其中包含许多索引,这些索引仅限于正在运行的sproc。

我尝试了一个表变量,但这似乎并不支持索引。一个当地的临时表似乎创造了一个真正的临时表。表,并且需要在proc的末尾显式删除,我从中推断它也在并发运行中共享,因此会中断。

我可以使用什么来存储数据,其索引仅限于正在运行的sproc的指示实例?

2 个答案:

答案 0 :(得分:3)

你不必担心掉桌子。 SQL Server会自动执行此操作。正如documentation

中所述
  
      
  • 存储过程完成后,将自动删除在存储过程中创建的本地临时表。表可以   由存储的任何嵌套存储过程引用   创建表的过程。该表不能被引用   调用创建表的存储过程的过程。
  •   

这是访问临时表的范围规则的结果。

我承认,在实践中,我倾向于在存储过程中显式删除临时表。不同之处:

  • create table temp
  • create table #temp
  • create table ##temp

非常类似于依赖于第二个被自动删除的事实,但第一个和第三个不是。然而,这是我的问题"而不是最佳做法。

答案 1 :(得分:1)

<强>更新

答案完全不用担心,因为临时表就好像它是存储过程中的局部变量一样。

我想确定我怀疑是否正确,所以我做了这个测试

create procedure TestTempData
as
begin
    declare @date datetime = getdate()
    if object_id('#testing') is not null
        drop table #testing
    create table #testing(
        Id int identity(1,1),
        [Date] datetime
    )

    print 'run at ' + format(@date,'HH:mm:ss')

    insert into #testing([Date]) values
    (dateadd(second,10,getdate())),
    (dateadd(second,20,getdate())),
    (dateadd(second,30,getdate()))
    waitfor delay '00:00:15'
    select * from #testing
end

然后我运行了这个查询

exec TestTempData

waitfor delay '00:00:02'

exec TestTempData

结果是

run at 14:57:39
Id  Date
1   2016-09-21 14:57:49.117
2   2016-09-21 14:57:59.117
3   2016-09-21 14:58:09.117

第二个结果

run at 14:57:56
Id  Date
1   2016-09-21 14:58:06.113
2   2016-09-21 14:58:16.113
3   2016-09-21 14:58:26.113
  

如果并发运行会影响#temp表,则两者都会产生结果   应该是不一样的,似乎是临时的   存储过程中的表就像一个局部变量   方法

在与Gordon Linoff聊天之前

由于您提到临时表是在并发运行之间共享的,因此临时表对于当前运行应该是唯一的。

您的存储过程应如下所示

create procedure YourProc(@userId int)
as
begin
   if object_id('#temp' + @userId) IS NOT NULL
       execute( 'DROP TABLE #temp' + @userId +'')
    ...
    execute('insert into #temp' + @userId + 'values(...')
end

上述解决方案将确保不会发生冲突,并且不会丢失任何数据,因为每次执行每次执行都是唯一的

你完成后不需要丢弃桌子,因为它会自动掉落

希望这会对你有所帮助