【问题标题】:How to get the current sproc session ID and drop a temp table existing in that sproc instance?如何获取当前 sproc 会话 ID 并删除该 sproc 实例中存在的临时表?
【发布时间】:2011-12-07 09:26:56
【问题描述】:

我正在使用 sql2000,我想在 sproc 实例或查询窗口中自动删除 #temp 表。这更多是出于测试目的而不是生产目的。有没有办法获取当前会话或 sproc 实例甚至查询实例,并使用它来仅删除该实例中的 #temp 表。我不想在其他情况下删除 #temp 表。

我注意到另一个 Stack Overflow 问题使用了这个code

declare @sql nvarchar(max) 
select @sql = isnull(@sql+';', '') + 
                                     'drop table ' + quotename(name) from tempdb..sysobjects 
where name like '#%' exec (@sql) 

我只想检测当前会话或实例中的#tmp 表。我还需要在 sql2008 中执行此操作。谢谢

谢谢。

【问题讨论】:

  • 临时表超出范围时会自动删除。见stackoverflow.com/questions/892351/…
  • 米奇,我正在查询窗口中进行测试。它们不会超出您正在测试的查询窗口的范围。所以我想加入一些代码,并删除所有#temp 表和walla ...不再有临时表。我不想每次都打开一个新的查询会话 b/c 我很懒。
  • 那么我怀疑您使用的临时表不正确...您应该在不再使用临时表时删除它。
  • 另一件事米奇,我非常依赖撤消,这是我尝试检测查询窗口会话并仅删除#temp 表的主要原因。 (即只有一个 #lb# 符号的那些。)
  • 你一定误会了,我不想手动删除一张临时表。我想把它们全部扔掉。假设我有 50 个临时表,我想保留我的撤消功能,并且我想检测我当前的会话并删除我所有的临时表。 Walla... 没有 drop #temp1 drop #temp2 ....... 我愿意接受新的建议,但是如果你有更好的技术。

标签: sql-server sql-server-2008 sql-server-2000


【解决方案1】:

您当前的 SPID,这同样适用于 2005 年及以上我尚未在 2000 实例上对其进行测试

select @@SPID  

显示您在 2005 年及以上的 spid 工作中所做的工作,不确定 2000 版

dbcc inputbuffer(54)   

在执行测试前查找 spid 和内核线程并截屏

   select spid, kpid, status, hostname, dbid, cmd
   from master..sysprocesses

开始测试后再次运行 SQL
参考本站http://support.microsoft.com/kb/117559

如果您知道名称可以删除临时表以获得所需的结果

IF object_ID('tempdb..#MyTempTable') is not null
begin
    drop table #MyTempTable
end


create table #MyTempTable
(id int);

insert into #MyTempTable (id) values (1);

select * from #MyTempTable

select * from tempdb.sys.tables
where object_id = object_id('tempdb..#MyTempTable')

IF object_ID('tempdb..#MyTempTable') is not null
begin
    drop table #MyTempTable
end

【讨论】:

  • 刚刚测试过,@@SPID 确实适用于 sql2000。我想我会使用那个删除表,但我真的想从我当前的@@SPID 中删除所有临时表。谢谢
  • 我认为这是解决方案。当您创建临时表时...将第一列或第二列的 spid 列设置为始终等于 @@spid。然后使用系统表 tempdb..sysobjects where name like '#%' 为您提供可用列表...然后搜索具有名为 'spid' 的列的那些,然后在它们中搜索 = @@ spid,并且只删除那些表。干得好。
【解决方案2】:

只需使用您怀疑的 SPID 杀死进程,然后将删除所有临时表(本地和全局)。

【讨论】:

  • 鲨鱼,我不知道我的 SPID 在哪里,也不知道如何区分一个 SPID。但是一旦我有了它,我相信我可以决定如何使用它,但是是的,我可以在我的 sp_who2 中看到大约数百个,在我的名字下看到大约 50 个。我只想选择我当前正在运行的进程。我对复活节彩蛋不感兴趣。
猜你喜欢
  • 2011-02-22
  • 1970-01-01
  • 2012-02-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-20
相关资源
最近更新 更多