Trong SQL Server, bạn có thể sử dụng OBJECT_ID()
hàm để trả về ID của một đối tượng, dựa trên tên của nó.
Điều này có thể hữu ích khi bạn cần ID của đối tượng, nhưng bạn chỉ biết tên của nó.
Định nghĩa chính thức của OBJECT_ID()
là nó trả về số nhận dạng đối tượng cơ sở dữ liệu của một đối tượng phạm vi lược đồ
.
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 OBJECT_ID('Artists') AS Result;
Kết quả:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
Trong trường hợp này, cơ sở dữ liệu hiện tại có chứa một đối tượng có tên là Albums
và ID của nó là 885578193. Đây là ID mà bạn có thể tìm thấy trong object_id
cột của sys.objects
chế độ xem danh mục hệ thống.
Ví dụ 2 - Kiểm tra Chế độ xem sys.objects
Đây là một ví dụ cơ bản khác để xác minh những gì tôi vừa nói.
SELECT name, object_id, OBJECT_ID(name) AS [OBJECT_ID(name)] FROM sys.objects WHERE name = 'Artists';
Kết quả:
+---------+-------------+-------------------+ | name | object_id | OBJECT_ID(name) | |---------+-------------+-------------------| | Artists | 885578193 | 885578193 | +---------+-------------+-------------------+
sys.objects
chế độ xem danh mục hệ thống chứa một hàng cho mỗi đối tượng phạm vi lược đồ, do người dùng xác định, được tạo trong cơ sở dữ liệu.
Trong ví dụ này, hai cột đầu tiên hiển thị name
của đối tượng và object_id
tương ứng.
Trong cột thứ ba của ví dụ này, tôi sử dụng OBJECT_ID()
để trả về ID của đối tượng dựa trên tên của nó. Để thực hiện việc này, tôi chuyển cột tên vào OBJECT_ID()
chức năng.
Đây rõ ràng chỉ là một ví dụ và sử dụng OBJECT_ID()
trong trường hợp này là không cần thiết vì sys.objects
đã trả về ID của đối tượng.
Ví dụ 3 - Một Ví dụ Hữu ích hơn
Trong ví dụ này, tôi sử dụng OBJECT_ID()
trong một WHERE
để tôi chỉ nhận được kết quả liên quan đến bảng có tên Client
.
SELECT OBJECT_NAME(referencing_id) AS [Referencing Entity], OBJECT_NAME(referencing_minor_id) AS [Referencing Minor Entity], referencing_class_desc AS [Class], COL_NAME(referenced_id, referenced_minor_id) AS [Column] FROM sys.sql_expression_dependencies WHERE referenced_id = OBJECT_ID('Client');
Kết quả:
+----------------------+----------------------------+------------------+------------+ | Referencing Entity | Referencing Minor Entity | Class | Column | |----------------------+----------------------------+------------------+------------| | uspGetClient | NULL | OBJECT_OR_COLUMN | NULL | | uspGetOrdersByClient | NULL | OBJECT_OR_COLUMN | NULL | | chkClientCode | NULL | OBJECT_OR_COLUMN | ClientCode | +----------------------+----------------------------+------------------+------------+
Trong trường hợp này, tôi muốn xem thực thể nào phụ thuộc vào Client
bảng (tức là thực thể nào tham chiếu bảng đó trong mã SQL của chúng). referenced_id
cột sử dụng ID của đối tượng, vì vậy bằng cách sử dụng OBJECT_ID()
, Tôi đã có thể lấy ID của Client
và so sánh nó với referenced_id
.
Xem Tìm sự phụ thuộc trong SQL Server:sql_expression_dependencies để có giải thích chi tiết hơn về truy vấn này và các ví dụ liên quan.
Ví dụ 4 - Tên Đủ điều kiện
Bạn cũng có tùy chọn xác định tên đối tượng với tên lược đồ và cả tên cơ sở dữ liệu nếu muốn.
Dưới đây là một ví dụ đơn giản để chứng minh:
SELECT OBJECT_ID('Artists') AS [1 Part Name], OBJECT_ID('dbo.Artists') AS [2 Part Name], OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];
Kết quả:
+---------------+---------------+---------------+ | 1 Part Name | 2 Part Name | 3 Part Name | |---------------+---------------+---------------| | 885578193 | 885578193 | 885578193 | +---------------+---------------+---------------+
Đây là một lần nữa, lần này sử dụng dấu ngoặc vuông làm dấu phân cách:
SELECT OBJECT_ID('[Artists]') AS [1 Part Name], OBJECT_ID('[dbo].[Artists]') AS [2 Part Name], OBJECT_ID('[Music].[dbo].[Artists]') AS [3 Part Name];
Kết quả:
+---------------+---------------+---------------+ | 1 Part Name | 2 Part Name | 3 Part Name | |---------------+---------------+---------------| | 885578193 | 885578193 | 885578193 | +---------------+---------------+---------------+
Kết quả tương tự.
Nếu bạn từng nhận được kết quả NULL mặc dù bạn biết đối tượng tồn tại, hãy thử định tính nó bằng lược đồ (và thậm chí cả tên cơ sở dữ liệu).
Ví dụ 5 - Truy vấn cơ sở dữ liệu chéo
Theo mặc định, SQL Server giả định rằng tên đối tượng nằm trong ngữ cảnh của cơ sở dữ liệu hiện tại. Bạn có thể sử dụng tên 3 phần để chỉ định một đối tượng trong cơ sở dữ liệu khác.
Đây là cùng một mã từ ví dụ trước, ngoại trừ lần này tôi chạy mã hai lần:lần đầu tiên nó chạy trong Music
cơ sở dữ liệu, lần thứ hai nó được chạy trong WideWorldImportersDW
cơ sở dữ liệu:
USE Music; SELECT OBJECT_ID('Artists') AS [1 Part Name], OBJECT_ID('dbo.Artists') AS [2 Part Name], OBJECT_ID('Music.dbo.Artists') AS [3 Part Name]; USE WideWorldImportersDW; SELECT OBJECT_ID('Artists') AS [1 Part Name], OBJECT_ID('dbo.Artists') AS [2 Part Name], OBJECT_ID('Music.dbo.Artists') AS [3 Part Name];
Kết quả:
Changed database context to 'Music'. +---------------+---------------+---------------+ | 1 Part Name | 2 Part Name | 3 Part Name | |---------------+---------------+---------------| | 885578193 | 885578193 | 885578193 | +---------------+---------------+---------------+ (1 row affected) Changed database context to 'WideWorldImportersDW'. +---------------+---------------+---------------+ | 1 Part Name | 2 Part Name | 3 Part Name | |---------------+---------------+---------------| | NULL | NULL | 885578193 | +---------------+---------------+---------------+ (1 row affected)
Trong kết quả đầu tiên, cả ba cột đều trả về đúng ID. Điều này là do đối tượng tình cờ nằm trong Music
cơ sở dữ liệu.
Trong kết quả thứ hai, chỉ có tên 3 phần là có thể tìm được đối tượng chính xác. Điều này được mong đợi, vì tên 1 phần và 2 phần không chỉ định tên của cơ sở dữ liệu, do đó nó giả định đối tượng nằm trong WideWorldImportersDW
(sai) cơ sở dữ liệu.
Ví dụ 6 - Chỉ định loại đối tượng
OBJECT_ID()
hàm cũng chấp nhận một đối số cho kiểu đối tượng. Đối số này, nếu được cung cấp, đứng sau tên của đối tượng.
Ví dụ:
SELECT OBJECT_ID('Artists', 'U') AS [Table];
Kết quả:
+-----------+ | Table | |-----------| | 885578193 | +-----------+
Ở đây, tôi chỉ định rằng loại đối tượng là U
, có nghĩa là "Bảng (do người dùng xác định)".
Nếu tôi cố gắng chỉ định một loại đối tượng khác, tôi nhận được NULL
:
SELECT OBJECT_ID('Artists', 'U') AS [Table], OBJECT_ID('Artists', 'V') AS [View], OBJECT_ID('Artists', 'P') AS [Stored Procedure];
Kết quả:
+-----------+--------+--------------------+ | Table | View | Stored Procedure | |-----------+--------+--------------------| | 885578193 | NULL | NULL | +-----------+--------+--------------------+
Đây là một lần nữa, nhưng với tên của một chế độ xem thay thế:
SELECT OBJECT_ID('RockAlbums', 'U') AS [Table], OBJECT_ID('RockAlbums', 'V') AS [View], OBJECT_ID('RockAlbums', 'P') AS [Stored Procedure];
Kết quả:
+---------+------------+--------------------+ | Table | View | Stored Procedure | |---------+------------+--------------------| | NULL | 1525580473 | NULL | +---------+------------+--------------------+