2011-10-14 18 views
0

我正在使用sql2000,我想自動將#temp表放入sproc實例或查詢窗口中。這比測試更適合生產。有沒有辦法獲得當前會話或sproc實例或查詢實例,並使用它來刪除該實例中的#temp表。我不想在其他實例中刪除#temp表。如何獲取當前的sproc會話ID並刪除該sproc實例中存在的臨時表?

我發現用這個code另一個堆棧溢出問題:

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

我只想檢測當前會話或實例只#tmp表。我也將需要在sql2008中做到這一點。 thx

謝謝。

+2

臨時表自動當它們超出範圍時就會下降。看到http://stackoverflow.com/questions/892351/sql-server-2005-and-temporary-table-scope –

+0

米奇,我正在查詢窗口中進行測試。它們不會在您正在測試的查詢窗口中超出範圍。所以我想放入一些代碼,並刪除所有#temp表和walla ...沒有更多的臨時表。我不想每次都要打開一個新的查詢會話b/c我很懶。 – RetroCoder

+0

然後我懷疑你正在使用臨時表格......你應該在不再使用臨時表格的時候刪除它。 –

回答

5

您當前的SPID,這同樣適用2005年和起來,我沒有測試它在2000實例

select @@SPID 

顯示你正在做在SPID workins什麼在2005年和最多不知道的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 
+0

經過測試,@@ SPID可以在sql2000上運行。我想我會使用該drop table,但我真的想從當前的@@ SPID中刪除所有臨時表。 thx – RetroCoder

+0

我認爲這是解決方案。當您創建一個臨時表時......將第一列或第二列的一列spid設置爲始終等於@@ spid。然後使用系統表tempdb..sysobjects,其中名稱如'#%'給你一個可用的列表...然後搜索那些名爲'spid'的列,然後找到那些= @@ spid,並只刪除那些表。做得好。 – RetroCoder

0

只要殺死您懷疑SPID的進程,然後將刪除所有臨時表(本地和全局)。

+0

鯊魚,我不知道我的SPID在哪裏,或者如何區分一個SPID和另一個SPID。但是一旦我有了這些,我相信我可以決定如何使用它,但是我可以在我的sp_who2中看到其中幾百個,而我的名字下面有大約50個。我只想選擇當前正在運行的進程。我對這個復活節不感興趣。 – RetroCoder

相關問題