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í v WideWorldImportersDW 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 |+---------+------------+--------------------+