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

Cách sử dụng OBJECT_ID () trên các đối tượng cơ sở dữ liệu chéo trong SQL Server

Một điểm khác biệt giữa OBJECT_ID()OBJECT_NAME() trong SQL Server là cú pháp được sử dụng cho các truy vấn cơ sở dữ liệu chéo. Ý tôi là, khi chúng được sử dụng trên các đối tượng trong một cơ sở dữ liệu khác.

OBJECT_NAME() hàm có đối số tùy chọn mà bạn có thể cung cấp, đối số này chỉ định ID cơ sở dữ liệu của cơ sở dữ liệu có chứa đối tượng mà bạn đang cố gắng lấy tên. Cung cấp đối số này cho phép bạn lấy tên của một đối tượng trên một cơ sở dữ liệu khác.

OBJECT_ID() mặt khác, không yêu cầu đối số như vậy. Thay vào đó, chức năng này cho phép bạn sử dụng tên gồm 3 phần để chỉ định cơ sở dữ liệu, lược đồ và tên của đối tượng mà bạn đang cố gắng lấy ID.

Bài viết này chứa các ví dụ về cách sử dụng OBJECT_ID() để lấy tên của một đối tượng từ một cơ sở dữ liệu khác.

Ví dụ 1 - Truy vấn 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ó.

USE WideWorldImportersDW;
SELECT OBJECT_ID('Music.dbo.Artists') AS Result;

Kết quả:

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

Tại đây, tôi đã chuyển sang WideWorldImportersDW cơ sở dữ liệu, sau đó truy vấn tên của một đối tượng trên Music cơ sở dữ liệu.

Ví dụ 2 - So sánh với Cơ sở dữ liệu hiện tại

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. Vì vậy, nếu bạn không sử dụng tên 3 phần để chỉ định một đối tượng trong cơ sở dữ liệu khác, thì SQL Server Database Engine sẽ chỉ tìm kiếm trong cơ sở dữ liệu hiện tại.

Đây là mã tương tự từ ví dụ trước, ngoại trừ lần này tôi bao gồm tên 1 bộ phận và 2 bộ phận. Ngoài ra, 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 cơ sở dữ liệu hiện tại là Music và đó là nơi đối tượng cư trú.

Trong kết quả thứ hai, chỉ có tên 3 phần là có thể tìm thấy đố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.

Nếu cả hai cơ sở dữ liệu đều có một đối tượng trong phạm vi giản đồ được gọi là Artists thì chúng ta có thể nhận được một kết quả khác. Trong những trường hợp như vậy, sẽ rất dễ nhầm tưởng rằng kết quả là đúng trong khi thực tế thì không.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. hiển thị nhiều bản ghi bằng cách sử dụng tập kết quả

  2. Tìm hiểu xem Ràng buộc KIỂM TRA là Cấp cột hay Cấp bảng trong SQL Server (Ví dụ T-SQL)

  3. Cách thay đổi định dạng ngày hiện tại trong SQL Server (T-SQL)

  4. Đối tượng 'DF __ *' phụ thuộc vào cột '*' - Thay đổi int thành double

  5. Tại sao SQL Server tự động bỏ qua khoảng trống ở cuối?