Bài viết này cung cấp năm tùy chọn để kiểm tra xem một bảng có tồn tại trong SQL Server hay không. Hầu hết các tùy chọn liên quan đến việc truy vấn chế độ xem hệ thống, nhưng một trong các tùy chọn thực thi một thủ tục được hệ thống lưu trữ và một tùy chọn khác liên quan đến một chức năng.
Tôi cũng bao gồm một số IF
đơn giản các câu lệnh có thể được sửa đổi cho phù hợp với hoàn cảnh của bạn.
Tùy chọn 1 - Chế độ xem sys.tables
Tùy chọn này truy vấn sys.tables
xem danh mục hệ thống. Dạng xem này trả về một hàng cho mỗi bảng người dùng. Do đó, bạn có thể truy vấn nó bằng cách sử dụng tên bảng mà bạn đang kiểm tra.
Ví dụ:
SELECT object_id FROM sys.tables WHERE name = 'Artists';
Kết quả:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Bạn cũng có thể thêm tên giản đồ vào những thứ bạn đang kiểm tra. Dưới đây là cách sửa đổi truy vấn trước đó để bao gồm tên giản đồ:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Kết quả:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Lưu ý rằng sys.tables
chế độ xem chỉ trả về ID giản đồ nên tôi phải chuyển ID đó vào SCHEMA_NAME()
để lấy tên của nó. Ngoài ra, tôi có thể đã sử dụng ID giản đồ nếu tôi biết điều đó.
Ví dụ:
SELECT object_id FROM sys.tables WHERE name = 'Artists' AND schema_id = 1;
Kết quả:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Tùy chọn 2 - Thủ tục lưu trữ sp_tables
Tùy chọn tiếp theo thực thi sp_tables
thủ tục được lưu trữ.
Dưới đây là cách cô đọng mã của bạn khi sử dụng phương pháp này:
sp_tables 'Artists'
Kết quả:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Tuy nhiên, thủ tục được lưu trữ này trả về các chế độ xem cũng như các bảng, vì vậy bạn nên thu hẹp nó thành chỉ các bảng (trừ khi bạn cũng muốn trả lại các chế độ xem). Để thu hẹp nó thành chỉ các bảng, hãy sử dụng @table_type = "'TABLE'"
.
Khi đang ở đó, bạn cũng có thể chỉ định chủ sở hữu bảng và người định tính bảng.
Ví dụ:
EXEC sp_tables @table_name = 'Artists', @table_owner = 'dbo', @table_qualifier = 'Music', @table_type = "'TABLE'", @fUsePattern = 1;
Kết quả:
+-------------------+---------------+--------------+--------------+-----------+ | TABLE_QUALIFIER | TABLE_OWNER | TABLE_NAME | TABLE_TYPE | REMARKS | |-------------------+---------------+--------------+--------------+-----------| | Music | dbo | Artists | TABLE | NULL | +-------------------+---------------+--------------+--------------+-----------+
Điều quan trọng cần lưu ý là @table_type
tham số chấp nhận một danh sách được phân tách bằng dấu phẩy. Do đó, nó hơi khác so với các thông số khác. @table_type
giá trị phải được đặt trong dấu ngoặc kép và mỗi mục được đặt trong dấu ngoặc kép. Trong ví dụ của tôi, chỉ có một mục danh sách, tuy nhiên, nó vẫn cần được đặt trong cả dấu ngoặc kép và dấu nháy đơn.
Tùy chọn 3 - INFORMATION_SCHEMA.TABLES
INFORMATION_SCHEMA.TABLES
chế độ xem hệ thống trả về một hàng cho mỗi bảng hoặc dạng xem trong cơ sở dữ liệu hiện tại mà người dùng hiện tại có quyền. Nó tương tự như sys.tables
, nhưng nó trả về ít cột hơn. Các dạng xem lược đồ thông tin có trong SQL Server tuân thủ định nghĩa tiêu chuẩn ISO cho INFORMATION_SCHEMA.
Dưới đây là một ví dụ về việc sử dụng nó để kiểm tra xem một bảng có tồn tại trong cơ sở dữ liệu hiện tại hay không:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists';
Kết quả:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Đây là một lần nữa, nhưng lần này tôi cũng chỉ định lược đồ:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_NAME = 'Artists' AND TABLE_SCHEMA = 'dbo';
Kết quả:
+-----------------+----------------+--------------+--------------+ | TABLE_CATALOG | TABLE_SCHEMA | TABLE_NAME | TABLE_TYPE | |-----------------+----------------+--------------+--------------| | Music | dbo | Artists | BASE TABLE | +-----------------+----------------+--------------+--------------+
Tùy chọn 4 - Hàm OBJECT_ID ()
Bạn cũng có thể sử dụng một hàm như OBJECT_ID()
để xem nó có trả về giá trị không phải NULL hay không.
Ví dụ:
SELECT OBJECT_ID('Artists', 'U') AS Result;
Kết quả:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Trong trường hợp này, bảng tồn tại. Lưu ý rằng tôi đã sử dụng U
để chỉ ra loại đối tượng (bảng do người dùng xác định).
Bạn cũng có thể cung cấp tên ba phần để bao gồm cơ sở dữ liệu và lược đồ:
SELECT OBJECT_ID('Music.dbo.Artists', 'U') AS Result;
Kết quả:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Nếu bảng không tồn tại, bạn sẽ nhận được NULL
:
SELECT OBJECT_ID('Oops!', 'U') AS Result;
Kết quả:
+----------+ | Result | |----------| | NULL | +----------+
Xem bên dưới để biết ví dụ về cách sử dụng điều này trong IF
tuyên bố.
Tùy chọn 5 - Chế độ xem sys.objects
Như thể không có ví dụ nào trước đây sẽ thực hiện công việc, đây là một cách khác để kiểm tra xem bảng có tồn tại hay không.
Lần này tôi truy vấn sys.objects
xem danh mục hệ thống. Dạng xem này trả về một hàng cho mỗi đối tượng phạm vi lược đồ, do người dùng xác định trong cơ sở dữ liệu. Nó không chỉ trả về các bảng mà còn trả về tất cả các loại đối tượng. Do đó, chúng ta cần thu hẹp nó xuống chỉ các bảng. Trong trường hợp này, tôi chỉ quan tâm đến các bảng do người dùng xác định, vì vậy tôi có thể sử dụng type = 'U'
(U
dành cho “USER_TABLE”). Ngoài ra, bạn có thể sử dụng TYPE_DESC = 'USER_TABLE'
.
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists';
Kết quả:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Đây là một lần nữa, nhưng chỉ định lược đồ:
SELECT object_id FROM sys.objects WHERE type = 'U' AND name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo';
Kết quả:
+-------------+ | object_id | |-------------| | 885578193 | +-------------+
Tùy chọn 6 - Chế độ xem sys.sysobjects (TRÁNH)
Tùy chọn này chỉ được liệt kê để tôi có thể khuyên bạn không nên sử dụng nó. sys.sysobjects
chế độ xem được bao gồm trong SQL Server để tương thích ngược và Microsoft khuyên bạn nên tránh sử dụng chế độ xem này trong công việc sau này.
Nếu bạn gặp phải mã sử dụng chế độ xem này, hãy xem xét sửa đổi nó để sử dụng sys.objects
hoặc một số chế độ xem hệ thống khác hoặc quy trình được lưu trữ.
Trong mọi trường hợp, đây là ví dụ trước có thể trông như thế nào nếu sử dụng sys.sysobjects
thay vì sys.objects
.
SELECT id FROM sys.sysobjects WHERE xtype = 'U' AND name = 'Artists';
Kết quả:
+-----------+ | id | |-----------| | 885578193 | +-----------+
Câu lệnh IF 1
Đây là IF
đơn giản câu lệnh kiểm tra sự tồn tại của bảng, sau đó in ra một thông báo khác tùy thuộc vào kết quả. Mã này có thể được sửa đổi để phù hợp với nhu cầu cụ thể của bạn.
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Artists' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Kết quả:
The table exists
Và đây là giao diện của nó khi bảng không tồn tại:
IF EXISTS (SELECT object_id FROM sys.tables WHERE name = 'Customer' AND SCHEMA_NAME(schema_id) = 'dbo') PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Kết quả:
The table does not exist
Câu lệnh IF 2
Đây là một IF
khác tuyên bố có thể được sửa đổi để phù hợp với nhu cầu cụ thể của bạn.
IF OBJECT_ID('Artists', 'U') IS NOT NULL PRINT 'The table exists' ELSE PRINT 'The table does not exist';
Kết quả:
The table exists