W SQL Server możesz użyć OBJECT_ID()
funkcja zwracająca identyfikator obiektu na podstawie jego nazwy.
Może to być przydatne, gdy potrzebujesz identyfikatora obiektu, ale znasz tylko jego nazwę.
Oficjalna definicja OBJECT_ID()
jest to, że zwraca numer identyfikacyjny obiektu bazy danych obiektu o zakresie schematu
.
Przykład 1 – Podstawowe użycie
Oto podstawowy przykład pokazujący, jak to działa.
SELECT OBJECT_ID('Artists') AS Result;
Wynik:
+-----------+ | Result | |-----------| | 885578193 | +-----------+
W takim przypadku bieżąca baza danych zawiera obiekt o nazwie Albums
, a jego identyfikator to 885578193. Jest to identyfikator, który można znaleźć w object_id
kolumna sys.objects
widok katalogu systemowego.
Przykład 2 – Sprawdź widok sys.objects
Oto kolejny podstawowy przykład weryfikujący to, co właśnie powiedziałem.
SELECT name, object_id, OBJECT_ID(name) AS [OBJECT_ID(name)] FROM sys.objects WHERE name = 'Artists';
Wynik:
+---------+-------------+-------------------+ | name | object_id | OBJECT_ID(name) | |---------+-------------+-------------------| | Artists | 885578193 | 885578193 | +---------+-------------+-------------------+
sys.objects
widok katalogu systemowego zawiera wiersz dla każdego zdefiniowanego przez użytkownika obiektu o zakresie schematu, który jest tworzony w bazie danych.
W tym przykładzie pierwsze dwie kolumny wyświetlają name
obiektu i object_id
odpowiednio.
W trzeciej kolumnie tego przykładu używam OBJECT_ID()
aby zwrócić identyfikator obiektu na podstawie jego nazwy. Aby to zrobić, przekazuję kolumnę nazwy do OBJECT_ID()
funkcja.
To oczywiście tylko przykład i użycie OBJECT_ID()
było w tym przypadku niepotrzebne, ponieważ sys.objects
już zwraca identyfikator obiektu.
Przykład 3 – Bardziej użyteczny przykład
W tym przykładzie używam OBJECT_ID()
w WHERE
tak, że otrzymuję tylko wyniki związane z tabelą o nazwie 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');
Wynik:
+----------------------+----------------------------+------------------+------------+ | 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 | +----------------------+----------------------------+------------------+------------+
W tym przypadku chciałem zobaczyć, które encje zależą od Client
tabela (tj. które jednostki odwołują się do tej tabeli w swoim kodzie SQL). referenced_id
kolumna używa identyfikatora obiektu, więc używając OBJECT_ID()
, udało mi się uzyskać identyfikator Client
tabeli i porównaj ją z referenced_id
.
Zobacz Znajdź zależności w SQL Server:sql_expression_dependencies, aby uzyskać bardziej szczegółowe wyjaśnienie tego zapytania i powiązanych przykładów.
Przykład 4 – w pełni kwalifikowane nazwy
Masz również możliwość zakwalifikowania nazwy obiektu nazwą schematu, a w razie potrzeby także nazwą bazy danych.
Oto prosty przykład do zademonstrowania:
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:
+---------------+---------------+---------------+ | 1 Part Name | 2 Part Name | 3 Part Name | |---------------+---------------+---------------| | 885578193 | 885578193 | 885578193 | +---------------+---------------+---------------+
I znowu, tym razem używając nawiasów kwadratowych jako ograniczników:
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:
+---------------+---------------+---------------+ | 1 Part Name | 2 Part Name | 3 Part Name | |---------------+---------------+---------------| | 885578193 | 885578193 | 885578193 | +---------------+---------------+---------------+
Ten sam wynik.
Jeśli kiedykolwiek otrzymasz wynik NULL, nawet jeśli wiesz, że obiekt istnieje, spróbuj zakwalifikować go za pomocą schematu (a nawet nazwy bazy danych).
Przykład 5 – Zapytania między bazami danych
Domyślnie SQL Server zakłada, że nazwa obiektu znajduje się w kontekście bieżącej bazy danych. Możesz użyć trzyczęściowej nazwy, aby określić obiekt w innej bazie danych.
Oto ten sam kod z poprzedniego przykładu, z tą różnicą, że tym razem 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ż obiekt znajduje się w Music
baza danych.
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.
Przykład 6 – Określ typ obiektu
OBJECT_ID()
funkcja przyjmuje również argument dla typu obiektu. Ten argument, jeśli został podany, występuje po nazwie obiektu.
Przykład:
SELECT OBJECT_ID('Artists', 'U') AS [Table];
Wynik:
+-----------+ | Table | |-----------| | 885578193 | +-----------+
Tutaj określam, że typ obiektu to U
, co oznacza „Tabela (zdefiniowana przez użytkownika)”.
Jeśli próbuję określić inny typ obiektu, otrzymuję NULL
:
SELECT OBJECT_ID('Artists', 'U') AS [Table], OBJECT_ID('Artists', 'V') AS [View], OBJECT_ID('Artists', 'P') AS [Stored Procedure];
Wynik:
+-----------+--------+--------------------+ | Table | View | Stored Procedure | |-----------+--------+--------------------| | 885578193 | NULL | NULL | +-----------+--------+--------------------+
Oto znowu, ale zamiast tego z nazwą widoku:
SELECT OBJECT_ID('RockAlbums', 'U') AS [Table], OBJECT_ID('RockAlbums', 'V') AS [View], OBJECT_ID('RockAlbums', 'P') AS [Stored Procedure];
Wynik:
+---------+------------+--------------------+ | Table | View | Stored Procedure | |---------+------------+--------------------| | NULL | 1525580473 | NULL | +---------+------------+--------------------+