V SQL Server můžete použít OBJECT_ID()
funkce, která vrátí ID objektu na základě jeho názvu.
To může být užitečné, když potřebujete ID objektu, ale znáte pouze jeho název.
Oficiální definice OBJECT_ID()
je, že vrací identifikační číslo databázového objektu objektu s rozsahem schématu
.
Příklad 1 – Základní použití
Zde je základní příklad, který demonstruje, jak to funguje.
SELECT OBJECT_ID('Artists') AS Result;
Výsledek:
+------------+| Výsledek ||------------|| 885578193 |+-----------+
V tomto případě aktuální databáze obsahuje objekt nazvaný Albums
a jeho ID je 885578193. Toto je ID, které můžete najít v object_id
sloupec sys.objects
zobrazení systémového katalogu.
Příklad 2 – Zkontrolujte zobrazení sys.objects
Zde je další základní příklad pro ověření toho, co jsem právě řekl.
SELECT name, object_id, OBJECT_ID(name) AS [OBJECT_ID(name)]FROM sys.objectsWHERE name ='Artists';
Výsledek:
+---------+-------------+-------------------+| jméno | object_id | OBJECT_ID(jméno) ||---------+-------------+-------------------| | Umělci | 885578193 | 885578193 |+---------+-------------+-------------------+
Soubor sys.objects
pohled systémového katalogu obsahuje řádek pro každý uživatelsky definovaný objekt v rozsahu schématu, který je vytvořen v databázi.
V tomto příkladu první dva sloupce zobrazují name
objektu a object_id
resp.
Ve třetím sloupci tohoto příkladu používám OBJECT_ID()
vrátit ID objektu na základě jeho názvu. Za tímto účelem předám sloupec názvu do OBJECT_ID()
funkce.
Toto je samozřejmě pouze příklad a použití OBJECT_ID()
bylo v tomto případě zbytečné, protože sys.objects
již vrací ID objektu.
Příklad 3 – užitečnější příklad
V tomto příkladu používám OBJECT_ID()
v WHERE
klauzuli, takže získám pouze výsledky související s tabulkou nazvanou 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_expressID) AS [Column]HEqOBREldependence_sys'idence. Klient');
Výsledek:
+----------------------+----------------------- -----+------------------+------------+| Odkazující entita | Odkazování na vedlejší entitu | třída | Sloupec ||----------------------+------------------------ ----+------------------+------------|| uspGetClient | NULL | OBJECT_OR_COLUMN | NULL || uspGetOrdersByClient | NULL | OBJECT_OR_COLUMN | NULL || chkClientCode | NULL | OBJECT_OR_COLUMN | ClientCode |+----------------------+------------------------- ----+------------------+------------+
V tomto případě jsem chtěl vidět, které entity závisí na Client
tabulka (tj. které entity odkazují na tuto tabulku ve svém kódu SQL). referenced_id
sloupec používá ID objektu, takže pomocí OBJECT_ID()
, podařilo se mi získat ID Client
tabulku a porovnejte ji s referenced_id
.
Podrobnější vysvětlení tohoto dotazu a související příklady naleznete v části Hledání závislostí na serveru SQL Server:sql_expression_dependencies.
Příklad 4 – Plně kvalifikovaná jména
Máte také možnost kvalifikovat název objektu názvem schématu a v případě potřeby také názvem databáze.
Zde je jednoduchý příklad k demonstraci:
SELECT OBJECT_ID('Artists') AS [1 Název části], OBJECT_ID('dbo.Artists') AS [2 Název části], OBJECT_ID('Music.dbo.Artists') AS [3 Název části];Výsledek:
+---------------+---------------+-------------- -+| 1 Název dílu | 2 Název dílu | Název 3 části ||---------------+---------------+-------------- --|| 885578193 | 885578193 | 885578193 |+---------------+---------------+--------------- +Tady je to znovu, tentokrát s použitím hranatých závorek jako oddělovačů:
SELECT OBJECT_ID('[Artists]') AS [1 Název části], OBJECT_ID('[dbo].[Artists]') AS [2 Název části], OBJECT_ID('[Hudba].[dbo].[ Artists]') AS [3 Part Name];Výsledek:
+---------------+---------------+-------------- -+| 1 Název dílu | 2 Název dílu | Název 3 části ||---------------+---------------+-------------- --|| 885578193 | 885578193 | 885578193 |+---------------+---------------+--------------- +Stejný výsledek.
Pokud někdy dostanete výsledek NULL, i když víte, že objekt existuje, zkuste jej kvalifikovat pomocí schématu (a dokonce i názvu databáze).
Příklad 5 – Křížové databázové dotazy
Ve výchozím nastavení SQL Server předpokládá, že název objektu je v kontextu aktuální databáze. Pro specifikaci objektu v jiné databázi můžete použít 3dílný název.
Zde je stejný kód z předchozího příkladu, až na to, že tentokrát kód spustím dvakrát:při prvním spuštění v
Music
při druhém spuštění vWideWorldImportersDW
databáze:USE Music;SELECT OBJECT_ID('Artists') AS [1 Název části], OBJECT_ID('dbo.Artists') AS [2 Název části], OBJECT_ID('Music.dbo.Artists') AS [3 Název části ];USE WideWorldImportersDW;SELECT OBJECT_ID('Artists') AS [1 Název části], OBJECT_ID('dbo.Artists') AS [2 Název části], OBJECT_ID('Music.dbo.Artists') AS [3 Název části];Výsledek:
Kontext databáze byl změněn na „Hudba“.+---------------+---------------+------- ---------+| 1 Název dílu | 2 Název dílu | Název 3 části ||---------------+---------------+-------------- --|| 885578193 | 885578193 | 885578193 |+---------------+---------------+--------------- +(1 řádek ovlivněn)Změněn kontext databáze na „WideWorldImportersDW“.+---------------+---------------+--- ------------+| 1 Název dílu | 2 Název dílu | Název 3 části ||---------------+---------------+-------------- --|| NULL | NULL | 885578193 |+---------------+---------------+--------------- + (dotčen 1 řádek)V prvním výsledku vrátí všechny tři sloupce správné ID. Je to proto, že objekt je náhodou v
Music
databáze.Ve druhém výsledku je pouze 3dílný název schopen najít správný objekt. To se dá očekávat, protože názvy 1 a 2 části neurčují název databáze, proto předpokládá, že objekt je v
WideWorldImportersDW
(špatná) databáze.Příklad 6 – Určete typ objektu
OBJECT_ID()
funkce také přijímá argument pro typ objektu. Tento argument, pokud je uveden, následuje za názvem objektu.Příklad:
SELECT OBJECT_ID('Artists', 'U') AS [Tabulka];Výsledek:
+------------+| Tabulka ||------------|| 885578193 |+-----------+Zde specifikuji, že typ objektu je
U
, což znamená „Tabulka (definovaná uživatelem)“.Pokud se pokusím zadat jiný typ objektu, dostanu
NULL
:SELECT OBJECT_ID('Umělci', 'U') AS [Tabulka], OBJECT_ID('Umělci', 'V') AS [Zobrazit], OBJECT_ID('Umělci', 'P') AS [Uložená procedura];Výsledek:
+-----------+--------+--------------------+| Tabulka | Zobrazit | Uložená procedura ||-----------+--------+--------------------|| 885578193 | NULL | NULL |+-----------+--------+--------------------+Tady je to znovu, ale s názvem pohledu:
SELECT OBJECT_ID('RockAlbums', 'U') AS [Tabulka], OBJECT_ID('RockAlbums', 'V') AS [Zobrazit], OBJECT_ID('RockAlbums', 'P') AS [Uložená procedura];Výsledek:
+---------+------------+--------------------+| Tabulka | Zobrazit | Uložená procedura ||---------+------------+--------------------|| NULL | 1525580473 | NULL |+---------+------------+--------------------+