Bảng SQL Server: sự khác biệt giữa @, # và ## là gì?


88

Trong SQL Server, sự khác biệt giữa bảng @, bảng # và bảng ## là gì?

Câu trả lời:


113

#table đề cập đến một bảng tạm thời cục bộ (chỉ hiển thị cho người dùng đã tạo nó).

##table đề cập đến một bảng tạm thời toàn cầu (hiển thị cho tất cả người dùng).

@variableName đề cập đến một biến có thể giữ các giá trị tùy thuộc vào loại của nó.


29
Định nghĩa của bạn về #table không hoàn toàn chính xác. Nó không giới hạn ở người dùng mà là kết nối. Nếu người dùng có nhiều kết nối, nó sẽ chỉ hiển thị với kết nối đã tạo #table ngay từ đầu.
Davin Studer

@DavinStuder đã đưa ra một lời giải thích quan trọng. Sự khác biệt giữa bảng hiển thị cho người dùng và một bảng chỉ hiển thị trên kết nối hiện tại là rất quan trọng.
mirzmaster

@DavinStuder làm thế nào để xem nhiều kết nối cho người dùng? cùng một chuỗi kết nối?
Kiquenet

25

4
Tôi nhận ra đây là câu trả lời từ rất lâu trước đây, nhưng vì đây là câu trả lời chỉ dành cho liên kết (và liên kết đầu tiên đã chết), nó có thể được cập nhật với các nội dung chính từ mỗi liên kết không?
Mike Guthrie

7

###các bảng là các bảng thực tế được biểu diễn trong cơ sở dữ liệu tạm thời. Các bảng này có thể có chỉ mục và thống kê, đồng thời có thể được truy cập trên các nhóm trong một phiên (trong trường hợp bảng tạm thời chung, bảng này có sẵn trong các phiên).

@Table là một biến bảng.

Để biết thêm: http://www.sqlteam.com/article/tempional-tables


4
Và biến bảng cũng sẽ nằm trong cơ sở dữ liệu tempDB, nếu kích thước của nó quá lớn để chứa trong bộ nhớ.
marc_s

6

Tôi sẽ tập trung vào sự khác biệt giữa #table và @table. ## table là một bảng tạm thời toàn cầu và đối với hồ sơ trong hơn 10 năm sử dụng SQL Server, tôi vẫn chưa gặp trường hợp sử dụng hợp lệ nào. Tôi chắc chắn rằng một số tồn tại nhưng bản chất của đối tượng khiến nó rất khó sử dụng được IMHO.

Phản hồi cho @whiner của @marc_s là hoàn toàn đúng: có một điều hoang đường phổ biến rằng các biến bảng luôn tồn tại trong bộ nhớ. Việc một biến bảng đi vào đĩa và hoạt động giống như một bảng tạm là điều khá phổ biến.

Dù sao, tôi khuyên bạn nên đọc về tập hợp các điểm khác biệt bằng cách làm theo các liên kết được chỉ ra bởi @Astander. Hầu hết sự khác biệt liên quan đến giới hạn về những gì bạn không thể làm với các biến @table.


Tôi có 5 thủ tục được lưu trữ riêng biệt thực hiện các phần khác nhau của phép tính và xuất ra một kết quả duy nhất. Để kiểm toán, tôi muốn xem các giá trị trung gian và kiểm toán viên cũng vậy. Tôi đã điều chỉnh các quy trình của mình để đưa một số ra bảng ## Temp để cả hai chúng ta có thể xem chúng nhưng chúng không được giữ lại (chúng chỉ cần thiết trong quá trình kiểm tra). Có một trường hợp sử dụng hợp lệ cho bạn (IMHO!).
RyanfaeScotland

@Ryan tại sao ## Table lại hợp lệ khi bạn có thể đã sử dụng dbo.Table? Tôi không coi đây là một trường hợp sử dụng hợp lệ khi tất cả những gì bạn đã làm là giúp bạn không phải nhập câu lệnh DROP.
Aaron Bertrand

4
Tôi không muốn cấp cho kiểm toán viên quyền DROP trên DB của tôi. Tôi cũng không muốn phải quay lại và dọn dẹp sau khi anh ấy làm xong. Với một bảng tạm thời, anh ta có thể chạy truy vấn thường xuyên như anh ta thích và tôi biết khi anh ta hoàn thành, anh ta sẽ không để lại dấu vết trong DB.
RyanfaeScotland

4
CREATE TABLE #t

Tạo bảng chỉ hiển thị trên và trong khi KẾT NỐI đó, cùng một người dùng tạo kết nối khác sẽ không thể nhìn thấy bảng #t từ kết nối kia.

CREATE TABLE ##t

Tạo một bảng tạm thời hiển thị cho các kết nối khác. Nhưng bảng sẽ bị loại bỏ khi kết nối tạo kết thúc.


SqlConnection.Open()với cùng một chuỗi kết nốicùng một KẾT NỐI ?
Kiquenet

2
không, đó là kết nối đến cùng một cơ sở dữ liệu, nhưng gần như chắc chắn không phải là kết nối giống nhau.
Markus

0

nếu bạn cần một bảng tạm thời toàn cục duy nhất, hãy tạo riêng của bạn với Tiền tố / Hậu tố Uniqueidentifier và bỏ thực thi bài đăng nếu một if object_id (.... Hạn chế duy nhất là sử dụng Dynamic sql và cần phải loại bỏ một cách rõ ràng.

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.