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

Uzyskaj identyfikator obiektu z jego nazwy w SQL Server:OBJECT_ID()

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               |
+---------+------------+--------------------+

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Konwertuj „datetime2” na „smalldatetime” w SQL Server (przykłady T-SQL)

  2. Jak zautomatyzować proces synchronizacji schematu bazy danych programu SQL Server

  3. Zaktualizuj wiersz

  4. Jakie kolumny generalnie tworzą dobre indeksy?

  5. Koniec wsparcia dla SQL Server 2008 i 2008 R2