Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Jak używać OBJECT_ID() na obiektach między bazami danych w SQL Server

Jedna różnica między OBJECT_ID() i OBJECT_NAME() w SQL Server to składnia używana do zapytań między bazami danych. Rozumiem przez to, gdy są używane na obiektach w innej bazie danych.

OBJECT_NAME() funkcja ma opcjonalny argument, który możesz podać, który określa identyfikator bazy danych zawierającej obiekt, którego nazwę próbujesz uzyskać. Podanie tego argumentu umożliwia uzyskanie nazwy obiektu w innej bazie danych.

OBJECT_ID() funkcja z drugiej strony nie wymaga takiego argumentu. Zamiast tego ta funkcja umożliwia użycie trzyczęściowej nazwy do określenia bazy danych, schematu i nazwy obiektu, którego identyfikator próbujesz uzyskać.

Ten artykuł zawiera przykłady użycia OBJECT_ID() aby uzyskać nazwę obiektu z innej bazy danych.

Przykład 1 – zapytanie podstawowe

Oto podstawowy przykład pokazujący, jak to działa.

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

Wynik:

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

Tutaj przełączyłem się na WideWorldImportersDW bazy danych, a następnie zapytał o nazwę obiektu w Music baza danych.

Przykład 2 – Porównanie z aktualną bazą danych

Domyślnie SQL Server zakłada, że ​​nazwa obiektu znajduje się w kontekście bieżącej bazy danych. Więc jeśli nie użyjesz trzyczęściowej nazwy do określenia obiektu w innej bazie danych, SQL Server Database Engine będzie szukał tylko w bieżącej bazie danych.

Oto ten sam kod z poprzedniego przykładu, z tą różnicą, że tym razem dołączam 1 część i 2 nazwy części. Ponadto uruchamiam kod dwukrotnie:przy pierwszym uruchomieniu w Music bazy danych, po raz drugi jest uruchamiany w WideWorldImportersDW baza danych:

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];

Wynik:

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)

W pierwszym wyniku wszystkie trzy kolumny zwracają poprawny identyfikator. Dzieje się tak, ponieważ aktualna baza danych to Music i tam właśnie znajduje się obiekt.

W drugim wyniku tylko 3 częściowa nazwa jest w stanie znaleźć właściwy obiekt. Należy się tego spodziewać, ponieważ nazwy części 1 i 2 nie określają nazwy bazy danych, dlatego zakłada się, że obiekt znajduje się w WideWorldImportersDW (nieprawidłowa) baza danych.

Jeśli obie bazy danych miały obiekt o zasięgu schematu o nazwie Artists wtedy moglibyśmy uzyskać inny wynik. W takich przypadkach łatwo byłoby błędnie założyć, że wynik jest poprawny, podczas gdy w rzeczywistości tak nie jest.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jak mogę pogrupować według kolumny daty i godziny bez uwzględniania czasu?

  2. Oblicz liczbę rekordów dla każdej daty między 2 datami

  3. Jak dodać plik danych do bazy danych programu SQL Server (T-SQL)

  4. Pobierz ostatni dzień miesiąca w SQL

  5. Magazyn zapytań SQL Server