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.