Trong SQL Server, các bảng tạm thời được tạo bằng cùng một CREATE TABLE
cú pháp như các bảng thông thường. Sự khác biệt là tên của các bảng tạm thời được bắt đầu bằng một hoặc hai dấu số (#
), tùy thuộc vào đó là bảng tạm thời cục bộ hay bảng tạm thời chung:
- Bảng tạm thời cục bộ được bắt đầu bằng một dấu số duy nhất (
#
) - Bảng tạm thời chung có tiền tố là một dấu số kép (
##
)
Ví dụ 1 - Tạo Bảng Tạm thời Cục bộ
Dưới đây là một ví dụ về cách tạo bảng tạm thời cục bộ:
CREATE TABLE #Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
Tên bạn chỉ định cho bảng tạm thời cục bộ có thể có tối đa 116 ký tự. Các loại bảng khác có thể có 128 ký tự, nhưng các bảng tạm thời cục bộ sẽ tự động được thêm vào bằng hậu tố số do hệ thống tạo.
Ví dụ 2 - Tạo Bảng Tạm thời Toàn cục
Dưới đây là ví dụ về cách tạo bảng tạm thời chung:
CREATE TABLE ##Cats ( CatId int PRIMARY KEY, CatName varchar(70) );
Tên bảng tạm thời chung có thể có tối đa 128 ký tự. SQL Server không nối hậu tố số do hệ thống tạo vào các bảng tạm thời chung như đối với các bảng tạm thời cục bộ, vì vậy bạn có thể sử dụng hết dung lượng.
Ví dụ 3 - Xem các Bảng Tạm thời
Tôi có thể chạy truy vấn sau để xem các bảng tạm thời mới được tạo của mình.
SELECT name FROM tempdb.sys.tables WHERE name LIKE '#Cats%' OR name = '##Cats';
Kết quả:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | +----------------------------------------------------------------------------------------------------------------------------------+
Chúng ta có thể thấy rằng bảng tạm thời cục bộ đã được nối thêm hậu tố số do hệ thống tạo ra và đây là lý do tại sao truy vấn của tôi sử dụng LIKE
toán tử cho bảng đó.
Ví dụ 4 - Phiên mới
Nếu tôi mở một phiên mới, tạo một bảng tạm thời cục bộ có cùng tên (Cats), sau đó chạy lại truy vấn này, tôi nhận được điều này:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | +----------------------------------------------------------------------------------------------------------------------------------+
Vì vậy, nhiều phiên có thể tạo một bảng cục bộ có cùng tên vì SQL Server sửa đổi tên đó bằng cách tăng hậu tố.
Ví dụ 5 - Cùng một phiên
Tuy nhiên, nếu tôi cố gắng tạo lại bảng tạm thời cục bộ trong cùng một phiên, tôi nhận được cái này:
Msg 2714, Level 16, State 6, Line 1 There is already an object named '#Cats' in the database.
Và nếu tôi mở thêm một phiên nữa, thì tôi đã thành công và khi tôi truy vấn tempdb.sys.tables
Tôi nhận được cái này:
+----------------------------------------------------------------------------------------------------------------------------------+ | name | |----------------------------------------------------------------------------------------------------------------------------------| | ##Cats | | #Cats_______________________________________________________________________________________________________________000000000018 | | #Cats_______________________________________________________________________________________________________________000000000019 | | #Cats_______________________________________________________________________________________________________________00000000001B | +----------------------------------------------------------------------------------------------------------------------------------+