Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

6 cách để kiểm tra xem một bảng có tồn tại trong SQL Server hay không (ví dụ T-SQL)

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

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Làm cách nào để tạo một số ngẫu nhiên cho mỗi hàng trong một lựa chọn T-SQL?

  2. sql địa lý để dbgeography?

  3. Làm thế nào để gọi Thủ tục đã lưu trong Chế độ xem?

  4. Có một SQL Server Profiler cho SQL Server Express không?

  5. Thêm cột bảng mới vào vị trí thứ tự cụ thể trong Microsoft SQL Server