sql >> Databasteknik >  >> RDS >> Sqlserver

Få ett objekts ID från dess namn i SQL Server:OBJECT_ID()

I SQL Server kan du använda OBJECT_ID() funktion för att returnera ett objekts ID, baserat på dess namn.

Detta kan vara användbart när du behöver ett objekts ID, men du bara känner till dess namn.

Den officiella definitionen av OBJECT_ID() är att den returerar databasobjektets identifieringsnummer för ett schema-omfattat objekt .

Exempel 1 – Grundläggande användning

Här är ett grundläggande exempel för att visa hur det fungerar.

SELECT OBJECT_ID('Artists') AS Result;

Resultat:

+-----------+
| Result    |
|-----------|
| 885578193 |
+-----------+

I det här fallet innehåller den aktuella databasen ett objekt som heter Albums , och dess ID är 885578193. Detta är ID:t som du kan hitta i object_id kolumnen i sys.objects systemkatalogvy.

Exempel 2 – Kontrollera vyn sys.objects

Här är ett annat grundläggande exempel för att verifiera det jag just sa.

SELECT 
  name,
  object_id,
  OBJECT_ID(name) AS [OBJECT_ID(name)]
FROM sys.objects
WHERE name = 'Artists';

Resultat:

+---------+-------------+-------------------+
| name    | object_id   | OBJECT_ID(name)   |
|---------+-------------+-------------------|
| Artists | 885578193   | 885578193         |
+---------+-------------+-------------------+

sys.objects systemkatalogvyn innehåller en rad för varje användardefinierat objekt med schemaomfattning som skapas i en databas.

I det här exemplet visar de två första kolumnerna objektets name och object_id respektive.

I den tredje kolumnen i detta exempel använder jag OBJECT_ID() för att returnera objektets ID baserat på dess namn. För att göra detta skickar jag namnkolumnen till OBJECT_ID() funktion.

Detta är uppenbarligen bara ett exempel och använder OBJECT_ID() var onödigt i det här fallet eftersom sys.objects returnerar redan objektets ID.

Exempel 3 – Ett mer användbart exempel

I det här exemplet använder jag OBJECT_ID() i en WHERE klausul så att jag bara får resultat relaterade till tabellen som heter 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');

Resultat:

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

I det här fallet ville jag se vilka enheter som är beroende av Client tabell (dvs. vilka enheter som refererar till den tabellen i sin SQL-kod). referenced_id kolumnen använder objektets ID, så genom att använda OBJECT_ID() , kunde jag få ID för Client tabell och jämför den med referenced_id .

Se Hitta beroenden i SQL Server:sql_expression_dependencies för en mer detaljerad förklaring av denna fråga och relaterade exempel.

Exempel 4 – Fullständigt kvalificerade namn

Du har också möjlighet att kvalificera objektnamnet med schemanamnet och även databasnamnet om så önskas.

Här är ett enkelt exempel att visa:

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];

Resultat:

+---------------+---------------+---------------+
| 1 Part Name   | 2 Part Name   | 3 Part Name   |
|---------------+---------------+---------------|
| 885578193     | 885578193     | 885578193     |
+---------------+---------------+---------------+

Här är den igen, denna gång med hakparenteser som avgränsare:

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];

Resultat:

+---------------+---------------+---------------+
| 1 Part Name   | 2 Part Name   | 3 Part Name   |
|---------------+---------------+---------------|
| 885578193     | 885578193     | 885578193     |
+---------------+---------------+---------------+

Samma resultat.

Om du någonsin får ett NULL-resultat trots att du vet att objektet finns, försök att kvalificera det med schemat (och till och med databasnamnet).

Exempel 5 – Korsdatabasfrågor

Som standard antar SQL Server att objektnamnet är i sammanhanget för den aktuella databasen. Du kan använda ett tredelat namn för att specificera ett objekt i en annan databas.

Här är samma kod från föregående exempel, förutom den här gången kör jag koden två gånger:första gången den körs i Music databas, andra gången den körs i WideWorldImportersDW databas:

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];

Resultat:

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)

I det första resultatet returnerar alla tre kolumnerna rätt ID. Detta beror på att objektet råkar vara i Music databas.

I det andra resultatet är det bara tredelarnas namn som kan hitta rätt objekt. Detta kan förväntas, eftersom 1 delen och 2 delens namn inte anger namnet på databasen, därför antar det att objektet finns i WideWorldImportersDW (fel) databas.

Exempel 6 – Ange objekttyp

OBJECT_ID() funktion accepterar också ett argument för objekttypen. Detta argument, om det tillhandahålls, kommer efter objektets namn.

Exempel:

SELECT 
  OBJECT_ID('Artists', 'U') AS [Table];

Resultat:

+-----------+
| Table     |
|-----------|
| 885578193 |
+-----------+

Här anger jag att objekttypen är U , vilket betyder "Tabell (användardefinierad)".

Om jag försöker ange en annan objekttyp får jag NULL :

SELECT 
  OBJECT_ID('Artists', 'U') AS [Table],
  OBJECT_ID('Artists', 'V') AS [View],
  OBJECT_ID('Artists', 'P') AS [Stored Procedure];

Resultat:

+-----------+--------+--------------------+
| Table     | View   | Stored Procedure   |
|-----------+--------+--------------------|
| 885578193 | NULL   | NULL               |
+-----------+--------+--------------------+

Här är den igen, men med namnet på en vy istället:

SELECT 
  OBJECT_ID('RockAlbums', 'U') AS [Table],
  OBJECT_ID('RockAlbums', 'V') AS [View],
  OBJECT_ID('RockAlbums', 'P') AS [Stored Procedure];

Resultat:

+---------+------------+--------------------+
| Table   | View       | Stored Procedure   |
|---------+------------+--------------------|
| NULL    | 1525580473 | NULL               |
+---------+------------+--------------------+

  1. TNSPING OK men sqlplus ger ORA-12154?

  2. Enhetstestning för PL/SQL

  3. Ange kolumnvärden som kolumnnamn i SQL-frågeresultatet

  4. SQL Azure:Databas XXXYYY på servern är för närvarande inte tillgänglig