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

Nhận ID của một đối tượng từ Tên của nó trong SQL Server:OBJECT_ID ()

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               |
+---------+------------+--------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. 9 Nhiệm vụ quan trọng mà DBA chịu trách nhiệm

  2. Lỗi máy chủ SQL 111:“… phải là câu lệnh đầu tiên trong một loạt truy vấn”

  3. Chỉ kích hoạt cập nhật SQL khi cột được sửa đổi

  4. Thay thế NULL bằng 0 trong truy vấn máy chủ SQL

  5. Tính toán số tháng đầy đủ giữa hai ngày trong SQL