2011-08-16 9 views
44

Tôi nhận thấy rằng các bảng tạm thời là phiên/kết nối bị ràng buộc và không hiển thị hoặc không truy cập được trong phiên/kết nối.Có cách nào để lấy danh sách tất cả các bảng tạm thời hiện tại trong SQL Server không?

Tôi có một quy trình được lưu trữ lâu dài để tạo các bảng tạm thời ở các giai đoạn khác nhau.

Có cách nào tôi có thể xem danh sách các bảng tạm thời hiện tại không? Tôi cần những đặc quyền nào để có thể làm như vậy?

Hoặc,

Có cách nào tôi có thể nhìn thấy câu lệnh SQL cụ thể đang được thực hiện bên trong quy trình được lưu không? Thủ tục đang chạy như một công việc theo lịch trình trong SQL Server.

Tôi đang sử dụng SQL Server 2000.

Cảm ơn bạn đã hướng dẫn.

Trả lời

71

Đây có phải là những gì bạn đang theo dõi không?

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

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

Điều này không thành công trong SQL Server 2000. – AAsk

+12

Năm 2008: tempdb.sys .objects, Năm 2000: tempdb..sysobjects –

+5

danh sách này liệt kê nhiều đối tượng khác nhau trong tempdb bao gồm các chỉ mục và các bảng tạm thời toàn cục. không nên được chọn làm câu trả lời – FLICKER

2

Nếu bạn cần 'xem' danh sách các bảng tạm thời, bạn có thể chỉ cần đăng nhập các tên được sử dụng. (và như những người khác đã lưu ý, có thể trực tiếp truy vấn thông tin này)

Nếu bạn cần 'xem' nội dung của các bảng tạm thời, bạn sẽ cần phải tạo các bảng thật với một tên tạm thời (duy nhất).

Bạn có thể theo dõi các lệnh SQL được thực thi sử dụng SQL Profiler:

[Những bài viết này nhắm mục tiêu các phiên bản SQL Server chậm nhất là năm 2000, nhưng phần lớn lời khuyên là như nhau.]

Nếu bạn có một quy trình dài quan trọng đối với doanh nghiệp của mình, bạn nên đăng nhập các bước khác nhau (tên/số bước, thời gian bắt đầu và kết thúc) trong quy trình. Bằng cách đó bạn có một đường cơ sở để so sánh với khi mọi thứ không hoạt động tốt và bạn có thể xác định (các) bước nào đang gây ra sự cố nhanh hơn.

+0

Cảm ơn. Bằng cách 'đăng nhập tên được sử dụng', tôi có đúng khi nghĩ rằng bạn muốn viết tên bảng tạm thời (sau khi tạo) thành một bảng khác không? – AAsk

+0

@AAsk: vâng, đó là một khả năng. Tôi có thể hỏi những gì bạn đang thực sự cố gắng giải quyết? Bạn có nhiều bảng tạm thời không? –

+0

Tôi có một quy trình được lưu trữ chạy mỗi tuần một lần vào Chủ nhật lúc 3 giờ sáng, thường chỉ mất chưa đầy 2 giờ. Chủ nhật tuần trước nó đã được thực hiện trong 6 giờ và chưa hoàn thành. Tôi đang chạy nó một lần nữa mà không thay đổi - vì thế câu hỏi của tôi. Nếu nó thất bại một lần nữa, tôi sẽ viết tin nhắn ở các giai đoạn quan trọng để một bảng 'gỡ rối' để tôi có thể thấy sự tiến bộ của nó. – AAsk

6

Bạn có thể lấy danh sách các bảng tạm thời bằng cách truy vấn sau đây:

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

Chỉ cần một chú thích, tôi sẽ tìm thấy mệnh đề cuối cùng của bạn dễ đọc hơn vì 'và object_id (...) không phải là null' –

+0

Điều này trả về bảng vĩnh viễn (rõ ràng có thể không thuộc về phiên của tôi) . –

2

Đối với SQL Server 2000, điều này sẽ cho bạn biết chỉ các bảng #temp trong phiên của bạn. (Phỏng theo my example for more modern versions of SQL Server here.) Điều này giả định bạn không đặt tên bảng của bạn với ba dấu gạch liên tiếp, như 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 

bạn có thể xóa dòng ## nếu bạn muốn bao gồm các bảng tạm thời toàn cầu.