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

Użyj OBJECT_NAME(), aby uzyskać nazwę obiektu z jego object_id w SQL Server

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Jaki jest odpowiednik bigint w C#?

  2. Wywołanie API z procedury składowanej SQL Server

  3. Jak upsert pandy DataFrame do tabeli Microsoft SQL Server?

  4. Utwórz konto pocztowe bazy danych w programie SQL Server (T-SQL)

  5. Dowiedz się, czy tabela jest partycjonowana w SQL Server (T-SQL)