Podczas korzystania z SQL Server, jeśli kiedykolwiek znajdziesz się przed wykonaniem sprzężenia z sys.objects
widok katalogu systemowego, aby uzyskać nazwę obiektu, może zatrzymaj się i przeczytaj to najpierw.
Transact-SQL ma wbudowaną funkcję o nazwie OBJECT_NAME()
który zwraca nazwę obiektu na podstawie jego identyfikatora.
Innymi słowy, jeśli masz identyfikator obiektu (na przykład object_id
kolumny), możesz po prostu przekazać ten identyfikator do OBJECT_NAME()
funkcja i zwróci nazwę obiektu – nie jest wymagane dołączenie!
Przykład 1 – Podstawowe użycie
Oto podstawowy przykład pokazujący, jak to działa.
SELECT name, object_id, OBJECT_NAME(object_id) AS [OBJECT_NAME(object_id)] FROM sys.objects WHERE name = 'Artists';
Wynik:
+---------+-------------+--------------------------+ | name | object_id | OBJECT_NAME(object_id) | |---------+-------------+--------------------------| | Artists | 885578193 | Artists | +---------+-------------+--------------------------+
Tutaj widzimy, że pierwsze dwie kolumny wyświetlają odpowiednio nazwę i identyfikator obiektu. Trzecia kolumna używa OBJECT_NAME()
funkcja zwracająca nazwę z identyfikatora.
To oczywiście tylko przykład, ale w tym przypadku, używając OBJECT_NAME()
było niepotrzebne, ponieważ sys.objects
już zwraca nazwę obiektu.
Następny przykład pokazuje, gdzie OBJECT_NAME()
może się przydać.
Przykład 2 – Bardziej użyteczny przykład
W tym przykładzie zwracam informacje o kluczu obcym, wysyłając zapytanie do sys.foreign_keys
widok katalogu systemowego.
Najpierw wybierzmy wszystkie kolumny, aby zobaczyć, co jest zwracane przez ten widok:
USE Music; SELECT * FROM sys.foreign_keys WHERE name = 'FK_Artists_Country';
Wynik (przy użyciu wyjścia pionowego):
name | FK_Artists_Country object_id | 1253579504 principal_id | NULL schema_id | 1 parent_object_id | 885578193 type | F type_desc | FOREIGN_KEY_CONSTRAINT create_date | 2019-08-27 16:14:39.560 modify_date | 2019-08-28 03:28:07.040 is_ms_shipped | 0 is_published | 0 is_schema_published | 0 referenced_object_id | 1205579333 key_index_id | 1 is_disabled | 0 is_not_for_replication | 0 is_not_trusted | 0 delete_referential_action | 0 delete_referential_action_desc | NO_ACTION update_referential_action | 0 update_referential_action_desc | NO_ACTION is_system_named | 0
Ten widok zwraca nazwę klucza obcego, ale nie nazwę jego obiektu nadrzędnego. Nie zwraca też nazwy obiektu, do którego odwołuje się klucz obcy. Zwraca tylko identyfikator tych obiektów (mianowicie parent_object_id
i referenced_object_id
).
Więc gdybyśmy mieli zawęzić to tylko do tych kolumn, otrzymalibyśmy coś takiego:
USE Music; SELECT name, parent_object_id, referenced_object_id FROM sys.foreign_keys WHERE name = 'FK_Artists_Country';
Wynik:
+--------------------+--------------------+------------------------+ | name | parent_object_id | referenced_object_id | |--------------------+--------------------+------------------------| | FK_Artists_Country | 885578193 | 1205579333 | +--------------------+--------------------+------------------------+
Na szczęście ostatnie dwie kolumny możemy przekazać do OBJECT_NAME()
w celu pobrania nazw obiektów.
Oto, co możemy zrobić, aby zwrócić nazwy.
USE Music; SELECT name AS [Foreign Key], OBJECT_NAME(parent_object_id) AS [Parent Object Name], OBJECT_NAME(referenced_object_id) AS [Referenced Object Name] FROM sys.foreign_keys WHERE name = 'FK_Artists_Country';
Wynik:
+--------------------+----------------------+--------------------------+ | Foreign Key | Parent Object Name | Referenced Object Name | |--------------------+----------------------+--------------------------| | FK_Artists_Country | Artists | Country | +--------------------+----------------------+--------------------------+
W przypadku dwóch ostatnich kolumn przekazuję odpowiednie wartości do OBJECT_NAME()
tak, aby zwracała nazwę każdego obiektu nadrzędnego.
Przykład 3 – Użycie OBJECT_NAME() w klauzuli WHERE
Oto przykład użycia OBJECT_NAME()
w WHERE
klauzula.
SELECT name, object_id, type_desc FROM sys.objects WHERE name = OBJECT_NAME(1253579504);
Wynik:
+--------------------+-------------+------------------------+ | name | object_id | type_desc | |--------------------+-------------+------------------------| | FK_Artists_Country | 1253579504 | FOREIGN_KEY_CONSTRAINT | +--------------------+-------------+------------------------+
Kwerendy między bazami danych
Domyślnie SQL Server zakłada, że identyfikator obiektu znajduje się w kontekście bieżącej bazy danych. Kwerenda odwołująca się do identyfikatora w innej bazie danych zwraca NULL lub niepoprawne wyniki.
Jeśli chcesz znaleźć nazwę obiektu z innej bazy danych, możesz podać identyfikator tej bazy danych jako drugi argument podczas wywoływania funkcji OBJECT_NAME()
.
Zobacz, jak uzyskać OBJECT_NAME() z innej bazy danych w SQL Server, aby zapoznać się z przykładami.