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

Sử dụng OBJECT_NAME () để lấy tên đối tượng từ object_id của nó trong SQL Server

Khi sử dụng SQL Server, nếu bạn thấy mình sắp thực hiện một phép nối với sys.objects xem danh mục hệ thống để lấy tên của một đối tượng, có thể dừng lại và đọc phần này trước.

Transact-SQL có một hàm tích hợp được gọi là OBJECT_NAME() trả về tên của một đối tượng, dựa trên ID của nó.

Nói cách khác, nếu bạn có ID của đối tượng (ví dụ:object_id ), bạn có thể chỉ cần chuyển ID đó vào OBJECT_NAME() và nó sẽ trả về tên của đối tượng cho bạn - không cần nối!

Ví dụ 1 - Cách sử dụng cơ bản

Dưới đây là một ví dụ cơ bản để chứng minh cách hoạt động của nó.

SELECT 
  name,
  object_id,
  OBJECT_NAME(object_id) AS [OBJECT_NAME(object_id)]
FROM sys.objects
WHERE name = 'Artists';

Kết quả:

+---------+-------------+--------------------------+
| name    | object_id   | OBJECT_NAME(object_id)   |
|---------+-------------+--------------------------|
| Artists | 885578193   | Artists                  |
+---------+-------------+--------------------------+

Ở đây, chúng ta có thể thấy rằng hai cột đầu tiên hiển thị tên và ID của đối tượng tương ứng. Cột thứ ba sử dụng OBJECT_NAME() chức năng trả về tên từ ID.

Đây rõ ràng chỉ là một ví dụ, nhưng trong trường hợp này, sử dụng OBJECT_NAME() không cần thiết vì sys.objects đã trả về tên của đối tượng.

Ví dụ tiếp theo cho thấy nơi OBJECT_NAME() có thể hữu ích.

Ví dụ 2 - Một Ví dụ Hữu ích hơn

Trong ví dụ này, tôi trả về thông tin về khóa ngoại bằng cách truy vấn sys.foreign_keys chế độ xem danh mục hệ thống.

Trước tiên, hãy chọn tất cả các cột để xem những gì được trả lại bởi chế độ xem này:

USE Music;
SELECT * 
FROM sys.foreign_keys
WHERE name = 'FK_Artists_Country';

Kết quả (sử dụng đầu ra dọc):

name                           | FK_Artists_Country
object_id                      | 1253579504
principal_id                   | NULL
schema_id                      | 1
parent_object_id               | 885578193
type                           | F 
type_desc                      | FOREIGN_KEY_CONSTRAINT
create_date                    | 2019-08-27 16:14:39.560
modify_date                    | 2019-08-28 03:28:07.040
is_ms_shipped                  | 0
is_published                   | 0
is_schema_published            | 0
referenced_object_id           | 1205579333
key_index_id                   | 1
is_disabled                    | 0
is_not_for_replication         | 0
is_not_trusted                 | 0
delete_referential_action      | 0
delete_referential_action_desc | NO_ACTION
update_referential_action      | 0
update_referential_action_desc | NO_ACTION
is_system_named                | 0

Dạng xem này trả về tên của khóa ngoại, nhưng không trả về tên của đối tượng cha của nó. Nó cũng không trả về tên của đối tượng được tham chiếu của khóa ngoại. Nó chỉ trả về ID của các đối tượng đó (cụ thể là parent_object_idreferenced_object_id ).

Vì vậy, nếu chúng tôi thu hẹp nó xuống chỉ những cột đó, chúng tôi sẽ nhận được một cái gì đó như sau:

USE Music;
SELECT
  name,
  parent_object_id,
  referenced_object_id
FROM sys.foreign_keys
WHERE name = 'FK_Artists_Country';

Kết quả:

+--------------------+--------------------+------------------------+
| name               | parent_object_id   | referenced_object_id   |
|--------------------+--------------------+------------------------|
| FK_Artists_Country | 885578193          | 1205579333             |
+--------------------+--------------------+------------------------+

May mắn thay, chúng tôi có thể chuyển hai cột cuối cùng sang OBJECT_NAME() để lấy tên đối tượng.

Đây là những gì chúng tôi có thể làm để trả lại tên.

USE Music;
SELECT
  name AS [Foreign Key],
  OBJECT_NAME(parent_object_id) AS [Parent Object Name],
  OBJECT_NAME(referenced_object_id) AS [Referenced Object Name]
FROM sys.foreign_keys
WHERE name = 'FK_Artists_Country';

Kết quả:

+--------------------+----------------------+--------------------------+
| Foreign Key        | Parent Object Name   | Referenced Object Name   |
|--------------------+----------------------+--------------------------|
| FK_Artists_Country | Artists              | Country                  |
+--------------------+----------------------+--------------------------+

Đối với hai cột cuối cùng, tôi chuyển các giá trị có liên quan đến OBJECT_NAME() để nó trả về tên của từng đối tượng mẹ.

Ví dụ 3 - Sử dụng OBJECT_NAME () trong Mệnh đề WHERE

Đây là một ví dụ về việc sử dụng OBJECT_NAME() trong một WHERE mệnh đề.

SELECT 
  name, 
  object_id, 
  type_desc  
FROM sys.objects  
WHERE name = OBJECT_NAME(1253579504);

Kết quả:

+--------------------+-------------+------------------------+
| name               | object_id   | type_desc              |
|--------------------+-------------+------------------------|
| FK_Artists_Country | 1253579504  | FOREIGN_KEY_CONSTRAINT |
+--------------------+-------------+------------------------+

Truy vấn cơ sở dữ liệu chéo

Theo mặc định, SQL Server giả định rằng ID đối tượng nằm trong ngữ cảnh của cơ sở dữ liệu hiện tại. Một truy vấn tham chiếu đến một ID trong cơ sở dữ liệu khác trả về kết quả NULL hoặc không chính xác.

Nếu bạn cần tìm tên đối tượng từ một cơ sở dữ liệu khác, bạn có thể cung cấp ID của cơ sở dữ liệu đó làm đối số thứ hai khi gọi OBJECT_NAME() .

Xem Cách lấy OBJECT_NAME () từ Cơ sở dữ liệu khác trong SQL Server để biết ví dụ.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Sử dụng DATABASEPROPERTYEX () để trả lại cài đặt cơ sở dữ liệu trong SQL Server

  2. Cách CHỌN * nhưng không có Tên cột phải là duy nhất trong mỗi dạng xem

  3. Hiệu suất máy chủ SQL - Kiểm tra trong đám mây

  4. Làm thế nào để sử dụng một biến cho tên cơ sở dữ liệu trong T-SQL?

  5. Kiểm tra email không thành công trong SQL Server (T-SQL)