2013-10-29 12 views
6

Tôi có một thủ tục được lưu trữ trước tiên kiểm tra bảng tạm thời (#temp_table), xóa nó nếu nó tồn tại, sử dụng bảng, sau đó cuối cùng giảm nó khi nó được thực hiện. SP này được gọi ngẫu nhiên khi người dùng thực hiện điều gì đó để kích hoạt nó và có khả năng đôi khi SP sẽ được thực hiện cùng một lúc - hoặc với một số trùng lặp.Trong MS SQL Server 2005, điều gì sẽ xảy ra khi một bảng tạm thời đang được truy cập bởi các thực thi khác nhau của cùng một SP?

Cho phép nói rằng tôi có Exec1 và Exec2 cả hai cùng một SP tạo, thay đổi và thả bảng #temp và chúng chạy trong mili giây của nhau.

Điều gì sẽ xảy ra? Exec1 sẽ khóa #temp_table và Exec2 đợi trong khi Exec1 kết thúc? Điều đó rõ ràng là mong muốn trong trường hợp của tôi. Tôi sẽ không muốn cả hai Exec1 & 2 để sử dụng bảng tại sametime, và cũng không muốn Exec2 thất bại vì Exec1 đã sử dụng bảng.

[EDIT] Tôi có nên chuyển bảng tạm thời thành biến bảng không?

Trả lời

5

Trong máy chủ sql nếu bạn tạo bảng tạm thời cục bộ, máy chủ sql # ký tự sử dụng một số điểm thấp và một số ID ở phía sau. Giả sử bạn tạo một bảng Temp với tên là #Temp máy chủ sql trong temp db Tạo một Bảng có tên #Temp_______10912098, mỗi bảng Nhiệt độ được tạo trong các kết nối riêng biệt sẽ có ID của chúng ở cuối tên.


TempTables

Đây là tất cả các bảng Temp Created trong Connections khác nhau tất cả có tên #Temp nhưng được nối với một số dấu gạch dưới và một máy chủ sql unique id sử dụng để phân biệt giữa chúng.

+1

Vì vậy, trong SP của tôi, tôi có 'IF OBJECT_ID ('tempdb .. # temp_table') IS NOT NULL \t DROP TABLE # temp_table' điều này không có gì sau đó? Hoặc điều này có thể có tác động bất lợi đến các hành vi khác không? – jreed121

+2

Bạn không cần điều đó nếu bạn đang gọi nó từ một phiên mới mỗi lần (ví dụ: từ một ứng dụng web), vì phạm vi của bảng tạm thời bị giới hạn trong phiên. Xem câu trả lời của tôi để biết thêm thông tin. –

+3

Bạn không cần như Dommer nói nhưng nó luôn luôn là một thực hành tốt để kiểm tra sự tồn tại của OBJECT trước khi bạn cố gắng tạo ra nó. giữ mã bit đó trong proc của bạn. –

4

Phạm vi của bảng tạm thời #table bị giới hạn trong phiên của bạn, do đó, nó không phải là vấn đề.

Nếu bạn đã sử dụng ##table, thì đó là toàn cầu và bạn sẽ gặp sự cố.

Xem ở đây: MSDN SQL Tables

Cụ bit này:

Nếu một phiên cơ sở dữ liệu tạo ra các bảng tạm thời địa phương #employees, chỉ phiên có thể làm việc với bảng, và nó sẽ bị xóa khi phiên ngắt kết nối. Nếu bạn tạo bảng tạm thời toàn cầu ##employees, bất kỳ người dùng nào trong cơ sở dữ liệu đều có thể làm việc với bảng này. Nếu không có người dùng nào khác làm việc với bảng này sau khi bạn tạo bảng, bảng sẽ bị xóa khi bạn ngắt kết nối. Nếu người dùng khác làm việc với bảng sau khi bạn tạo, SQL Server sẽ xóa nó sau khi bạn ngắt kết nối và sau khi tất cả các phiên khác không còn sử dụng nó nữa.

3

Bảng tạm thời có tên băm # dành riêng cho kết nối riêng lẻ. Vì vậy, nếu hai kết nối (còn được gọi là "quy trình" hoặc "SPID") cả hai tham chiếu bảng tạm thời bởi cùng một #tablename, chúng sẽ thực sự tham chiếu các bảng khác nhau.

Bạn có thể thấy điều này nếu bạn nhìn vào tempdb. Sẽ có nhiều bảng có tên là #748B826C.Đây là các biến bảng tạm thời thực tế như declare @t table (ix int identity primary key) và tên bảng tạm thời có băm.

Vì vậy, với điều kiện đây là các kết nối khác nhau chứ không phải là trình kích hoạt đệ quy, sẽ không có vấn đề gì. Tuy nhiên,

tuy nhiên, nếu bạn lo ngại về khả năng xảy ra đệ quy đệ quy, bạn nên sử dụng các biến bảng. Chúng được giới hạn trong phạm vi của lô hoặc proc được lưu trữ.

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