我需要创建一个表,其中包含许多索引,这些索引仅限于正在运行的sproc。
我尝试了一个表变量,但这似乎并不支持索引。一个当地的临时表似乎创造了一个真正的临时表。表,并且需要在proc的末尾显式删除,我从中推断它也在并发运行中共享,因此会中断。
我可以使用什么来存储数据,其索引仅限于正在运行的sproc的指示实例?
答案 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
上述解决方案将确保不会发生冲突,并且不会丢失任何数据,因为每次执行每次执行都是唯一的
你完成后不需要丢弃桌子,因为它会自动掉落
希望这会对你有所帮助