2011-08-16 147 views
44

我意識到,臨時表是會話/連接綁定的,並且不可見或不可訪問會話/連接。有沒有辦法獲得SQL Server中所有當前臨時表的列表?

我有一個長時間運行的存儲過程,在各個階段創建臨時表。

有沒有辦法可以看到當前臨時表的列表? 我需要什麼特權才能這樣做?

另外,

有沒有一種方法,我可以看到一個正在運行的存儲過程中正在執行的特定的SQL語句?該過程作爲SQL Server中的計劃作業運行。

我使用SQL Server 2000中

感謝您的指導。

回答

71

這是你在追求什麼?

select * from tempdb..sysobjects 
--for sql-server 2000 and later versions 

select * from tempdb.sys.objects 
--for sql-server 2005 and later versions 
+0

SQL Server 2000中的此失敗。 – AAsk

+12

2008年:tempdb.sys .objects,2000:tempdb..sysobjects –

+5

它列出了tempdb中的許多不同對象,包括索引和全局臨時表。不應該被選爲答案 – FLICKER

2

如果您需要「查看」臨時表的列表,您可以簡單地記錄使用的名稱。 (和其他人指出,可以直接查詢這些信息)

如果你需要「看」臨時表的內容,您將需要創建真實的表用(唯一的)臨時名稱。

您可以跟蹤SQL中使用SQL事件探查器中執行:

[這些文章不遲於2000年針對SQL Server版本,但大部分建議是一樣的。]

如果您有一個對您的業務非常重要的漫長流程,最好在流程中記錄各個步驟(步驟名稱/編號,開始時間和結束時間)。通過這種方式,您可以有一個比較基準,當事情表現不佳時,您可以更快速地確定哪些步驟會導致問題。

+0

謝謝。通過「記錄使用的名稱」,我是否正確地認爲你的意思是將臨時表名稱(在創建之後)寫入另一個表中? – AAsk

+0

@A問:是的,這是一種可能性。我能問你實際上想要解決什麼嗎?你有很多臨時表嗎? –

+0

我的存儲過程在星期日的凌晨3點每週運行一次,通常只需要不到2個小時。上週日它繼續了6個小時,還沒有完成。我沒有改變地再次運行 - 因此我的問題。如果它再次失敗,我將在關鍵階段寫入消息到「調試」表,以便我看到它的進展。 – AAsk

6

您可以通過下面的查詢得到臨時表的列表:

select left(name, charindex('_',name)-1) 
from tempdb..sysobjects 
where charindex('_',name) > 0 and 
xtype = 'u' and not object_id('tempdb..'+name) is null 
+0

只是一個評論,我會發現你的最後一個子句更可讀,因爲'和object_id(...)不爲空' –

+0

這也返回永久表(這顯然可能不屬於我的會話) 。 –

2

對於SQL Server 2000,這應該告訴你,只在會話中#TEMP表。 (從my example for more modern versions of SQL Server here改編。)這是假設你不連續三個下劃線,像CREATE TABLE #foo___bar命名錶:

SELECT 
    name = SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1), 
    t.id 
FROM tempdb..sysobjects AS t 
WHERE t.name LIKE '#%[_][_][_]%' 
AND t.id = 
    OBJECT_ID('tempdb..' + SUBSTRING(t.name, 1, CHARINDEX('___', t.name)-1)); 
2
SELECT left(NAME, charindex('_', NAME) - 1) 
FROM tempdb..sysobjects 
WHERE NAME LIKE '#%' 
    AND NAME NOT LIKE '##%' 
    AND upper(xtype) = 'U' 
    AND NOT object_id('tempdb..' + NAME) IS NULL 

可以去掉##行,如果你想包括全局臨時表。

相關問題