Hai phiên có thể tạo các bảng #temp có cùng tên không?


16

Tôi đang tạo một bảng tạm thời ( #myTable) và sử dụng một con trỏ. Điều này có tạo ra vấn đề khi người dùng đồng thời truy cập con trỏ qua ứng dụng của tôi không? Nó có cho phép tôi tạo các bảng tạm thời riêng biệt có cùng tên không?

Sau đây là mã mẫu:

Open cursor;
Fetch Next from cursor into @Variable_Temp_Table_Name;
Create table #myTable(pk int)
While @@Fetch_Status = 0
Begin    
Fetch Next from cursor into @Variable_Temp_Table_Name;
End 

Câu trả lời:


20

Máy chủ SQL luôn thêm một số số ngẫu nhiên vào cuối tên bảng tạm thời (phía sau hậu trường), khi người dùng đồng thời tạo các bảng tạm thời trong các phiên của họ có cùng tên, máy chủ sql sẽ tạo nhiều bảng tạm thời trong tempdb.

Tôi đã tạo 3 bảng tạm thời được gọi #TempTabletrong ba phiên khác nhau trong SSMS của mình, bây giờ nếu tôi truy cập tempdb, tôi có thể thấy các bảng tạm thời được tạo ở đó với một chuỗi ngẫu nhiên (duy nhất) được gắn vào tên của mỗi bảng tạm thời.

nhập mô tả hình ảnh ở đây


11

Có, nhiều ứng dụng sẽ nhận được các bản sao của bảng #temp. Đó là điểm sử dụng bảng #temp, bởi vì mỗi phiên đồng thời có đối tượng riêng biệt, riêng biệt. Điều này không liên quan gì đến việc bạn có đang sử dụng con trỏ kết hợp với bảng #temp của mình hay không (mặc dù tôi nghi ngờ con trỏ không cần thiết dù sao - bạn không bao gồm đủ mã để nhận xét cụ thể).

Chỉnh sửa để bao gồm nhận xét:

Một điều nữa về việc sử dụng các bảng #temp là nếu bạn cần thêm các ràng buộc cho chúng, hãy để máy chủ SQL tạo tên khác mặc dù bảng sẽ là duy nhất cho phiên, ràng buộc sẽ không xảy ra và trường hợp thứ hai sẽ lỗi khi tạo bàn.


7
Một điều nữa về việc sử dụng các bảng #temp là nếu bạn cần thêm các ràng buộc cho chúng, hãy để máy chủ SQL tạo tên khác mặc dù bảng sẽ là duy nhất cho phiên, ràng buộc sẽ không xảy ra và trường hợp thứ hai sẽ lỗi khi tạo bàn.
Aaron

1
@Aaron - Đề nghị bạn chuyển nhận xét về các ràng buộc không tên vào câu trả lời. Rất nhiều người nhầm lẫn về chi tiết đó.
RLF

Cũng lưu ý rằng nếu ai đó không muốn có một bảng tạm thời toàn cầu, họ có thể khai báo nó ##likeThis.
gạch dưới

@RLF và Aaron: người ta luôn có thể tạo GUID với NEWID () và tạo ràng buộc thông qua SQL động. Không nói rằng nó sạch như đưa nó vào câu lệnh CREATE TABLE, nhưng ít nhất nó là một tùy chọn. Và tôi cũng tin rằng các ràng buộc FK không được phép trên các bảng tạm thời (miễn là chúng ta đang nói về các ràng buộc một cách khái quát).
Solomon Rutzky

@srutzky - Đúng, nhưng các ràng buộc được đặt tên thường được đặt tên để dễ dàng tham chiếu chúng từ mã. Sử dụng NEWID () sẽ không cung cấp sự đơn giản hóa đó, mặc dù bạn có thể truy vấn để tìm NEWID nếu cần.
RLF
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.