2010-07-26 39 views
7

Tôi đang tận dụng các bảng tạm thời #tempTable trong thủ tục lưu trữ của tôi - mà tôi sử dụng để chạy báo cáo ASP.net (dịch vụ báo cáo) của tôiPhạm vi Bảng tạm thời?

Tôi đang làm một cái gì đó giống như

ví dụ. Mã

SELECT * INTO #tempTable FROM Contacts WHERE ContactID < 10 

Sau đó, tôi sử dụng một cái gì đó giống như

SELECT o.* FROM #tempTable t INNER JOIN Orders o ON t.ContactID =o.ContactID 

để trở về giá trị để báo cáo của tôi aka kết quả cho các thủ tục lưu trữ

tôi không thoát khỏi #tempTable tôi

tức Tôi không làm

DROP TABLE #tempTable 

Tôi đã đọc rằng phạm vi của bảng tạm thời chỉ dành cho thủ tục được lưu trữ - vì vậy, hãy thực hiện những điều cần thiết ở trên - nếu tôi không thực hiện các vấn đề trên, tôi sẽ gặp phải vấn đề nào trong tương lai

+0

@Tom: Đây có thể là ví dụ đơn giản. Có những lúc chúng được yêu cầu. – Hogan

Trả lời

2

rõ ràng thả mọi bảng tạm thời mà bạn tạo ra. Nếu bạn đang thực hiện các kịch bản thông qua SQL Server Management Studio/Query Analyzer, các bảng tạm thời được giữ cho đến khi bạn thả chúng một cách rõ ràng hoặc cho đến khi bạn đóng phiên.

+0

Nhưng nếu tôi gọi cho họ thông qua một ứng dụng ASP.net? – soldieraman

+1

Bảng tạm thời cục bộ được tạo trong quy trình được lưu trữ sẽ tự động bị mất khi quy trình được lưu trữ hoàn tất. Tuy nhiên, tôi có xu hướng thả chúng ngay sau khi tôi không còn cần chúng nữa. Tôi đoán điều này quan trọng hơn trong các procs được lưu trữ lâu dài phức tạp. –

1

Nói chung, có thể bạn sẽ không gặp vấn đề gì khi không bỏ các bảng tạm thời. Bảng tạm thời cục bộ có phạm vi phiên hoặc phạm vi SP trong trường hợp của bạn. Nó sẽ tự động thả khi phiên được đóng hoặc SP hoàn thành.

Tuy nhiên, bạn có thể tăng nguy cơ gặp sự cố bằng cách thường xuyên theo dõi thực tiễn này. Ví dụ, nếu bạn không sử dụng một SP, nhưng gửi câu lệnh SELECT của bạn từ ASP .net và để mở kết nối SQL Server, bảng tạm thời sẽ tiếp tục tồn tại. Tiếp tục sử dụng kết nối và các bảng tạm thời khác sẽ dẫn đến tăng trưởng tempdb theo thời gian.

Tôi cũng hỗ trợ các nhận xét khác liên quan đến việc sử dụng bảng tạm thời trong trường hợp này. Nếu bạn tạo một giải pháp không có bảng tạm thời, có thể bạn sẽ có một báo cáo nhanh hơn và tránh lệnh DROP temp table nữa.

10

Đầu tiên, các bảng tạm thời cục bộ được tạo trong quy trình sẽ bị xóa khi quy trình kết thúc. Từ số BOL on Create Table:

Bảng tạm thời cục bộ được tạo trong quy trình được lưu sẽ tự động bị xóa khi thủ tục lưu trữ hoàn tất. Bảng có thể được tham chiếu bởi bất kỳ thủ tục được lưu trữ lồng nhau nào được thực hiện bởi thủ tục đã lưu trữ đã tạo bảng. Bảng không thể được tham chiếu bởi quá trình được gọi là thủ tục lưu sẵn đã tạo bảng.

Nếu mã truy cập dữ liệu của bạn đang mở kết nối đúng cách, gọi thủ tục đã lưu và sau đó đóng kết nối, bảng tạm thời được tạo trong quy trình sẽ bị hủy.

Tôi nói "hiệu quả" để đưa ra một điểm khác. Tôi sẽ không khuyên bạn nên bỏ bảng tạm thời vào cuối thủ tục của bạn mặc dù tôi sẽ thêm một kiểm tra ngay trước khi tôi tạo bảng tạm thời và thả nó nếu tồn tại (ví dụ: if object_id('tempdb..#Foo') is not null). Lập luận chống lại việc giảm bảng tạm thời ở cuối là bằng cách gọi câu lệnh Drop, bạn buộc SQL Server phải tốn nhiều tài nguyên để phá hủy bảng đó và ở đó trong khi bạn đợi thủ tục kết thúc.Nếu thay vào đó, bạn để cho nó đi ra khỏi phạm vi, thủ tục của bạn kết thúc ngay lập tức và bạn để cho SQL Server phá hủy bảng tại một thời điểm lựa chọn riêng của nó.

7

Bảng #Temp là phạm vi giới hạn đối với SESSION và tuổi thọ của lô, nghĩa là không ai khác có thể xem bảng tạm thời của bạn và bất kỳ ai khác có thể tạo bảng #Temp của chính họ có cùng tên. Khi phiên hoặc hàng loạt của bạn kết thúc, SQL Server sẽ dọn sạch bảng tạm thời.

Trên ghi chú khác, bảng ## Temp hoạt động như một bảng bình thường. Mọi người đều có thể nhìn thấy nó, và không thể có nhiều hơn 1 # # Bảng Temp có cùng tên. SQL Server sẽ làm sạch các bảng ## Temp này khi máy chủ khởi động lại.

+7

Điều này không hoàn toàn chính xác. Bảng tạm thời KHÔNG được giới hạn trong phạm vi của lô - chúng tồn tại trong toàn bộ phiên bất kể lô. Tức là, bạn có thể tạo bảng tạm thời, sử dụng 'GO' và bảng tạm thời sẽ vẫn tồn tại với dữ liệu của nó. – ean5533

+1

Tôi đang chạy vào một tình huống mà một bảng tạm thời được tạo ra trong một .NET SqlCommand tồn tại sẽ không tồn tại thông qua một SqlCommand thứ hai, mặc dù chúng đang chạy trên cùng một kết nối mở. – Triynko

Các vấn đề liên quan