Pokud budete někdy potřebovat zjistit, zda databáze obsahuje nějaké tabulky, které nemají primární klíč, můžete v SQL Serveru spustit kterýkoli z následujících skriptů a vrátit pouze tyto tabulky.
Všechny tyto skripty využívají OBJECTPROPERTY()
funkce. Tato funkce přijímá TableHasPrimaryKey
argument, že můžete zkontrolovat hodnotu 0
. Pokud je to 0
, tabulka nemá primární klíč. Pokud je to 1
to dělá. Proto můžete také použít tuto funkci k vrácení všech tabulek s primární klíč.
Tyto skripty jednoduše vrátí název tabulky a její schéma, ale vždy je můžete upravit tak, aby vrátily více sloupců.
Možnost 1 – OBJECTPROPERTY() se sys.tables
Soubor sys.tables
systémový pohled je pravděpodobně tím nejviditelnějším místem, kde začít. Toto zobrazení vrátí řádek pro každou uživatelskou tabulku, a když použijeme OBJECTPROPERTY()
filtrovat výsledky na základě TableHasPrimaryKey
vlastnost je 0
, dostaneme pouze ty tabulky bez primárního klíče.
USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schéma], name AS [Tabulka]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Tabulka];
Výsledek:
Kontext databáze byl změněn na 'Test'.+----------+--------------------+| Schéma | Tabulka ||----------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Jednotlivec || dbo | Povolání || dbo | Tým || dbo | TimeTest |+----------+--------------------+ (dotčených 7 řádků)
V tomto případě je moje aktuální databáze testovací databáze s hromadou tabulek bez primárních klíčů.
Pokud spustím stejný příkaz v jiné databázi, nedostanu žádné výsledky:
USE Music;SELECT SCHEMA_NAME(schema_id) AS [Schéma], název AS [Table]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schéma], [Tabulka];
Výsledek:
Kontext databáze byl změněn na 'Hudba'. (0 ovlivněných řádků)
Možnost 2 – OBJECTPROPERTY() s INFORMATION_SCHEMA.TABLES
Tento příklad je podobný předchozímu, ale tentokrát se ptám na INFORMATION_SCHEMA.TABLES
Pohled. Zobrazení informačního schématu zahrnutá v SQL Serveru vyhovují definici normy ISO pro INFORMATION_SCHEMA.
USE Test;SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)), 'TableHasPrimaryKey') =0 ANDTABLE_TYPE='ORTABASE_MABLE_NAME>Výsledek:
Kontext databáze byl změněn na „Test“.+----------------+--------------------+ | TABLE_SCHÉMA | TABLE_NAME ||----------------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Jednotlivec || dbo | Povolání || dbo | Tým || dbo | TimeTest |+----------------+--------------------+ (dotčených 7 řádků)Možnost 3 – OBJECTPROPERTY() se sys.objects
V tomto příkladu se dotazuji na
sys.objects
Pohled. Toto je obecnější pohled ve srovnání s předchozími dvěma a vrací informace o objektech s rozsahem schématu (nejen tabulkách). Z tohoto důvodu musíme výsledky filtrovat pomocítype = 'U'
.U
zde znamená uživatelsky definovanou tabulku.Opět můžeme použít
OBJECTPROPERTY()
filtrovat výsledky pouze na ty tabulky, které nemají primární klíč.USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schéma], název JAKO [Tabulka]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(NÁZEV_SCHÉMAU(id_schema), '.', název)) , 'TableHasPrimaryKey') =0ORDER BY [Schéma], [Tabulka]Výsledek:
Kontext databáze byl změněn na 'Test'.+----------+--------------------+| Schéma | Tabulka ||----------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Jednotlivec || dbo | Povolání || dbo | Tým || dbo | TimeTest |+----------+--------------------+ (dotčených 7 řádků)Alternativně bychom to mohli filtrovat podle
type_desc = 'USER_TABLE'
, což by přineslo stejný výsledek.USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schéma], name AS [Tabulka]FROM sys.objects WHERE type_desc ='USER_TABLE'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(NAME_SCHEMA(id_schema), '.', název)) , 'TableHasPrimaryKey') =0ORDER BY [Schéma], [Tabulka]Výsledek:
Kontext databáze byl změněn na 'Test'.+----------+--------------------+| Schéma | Tabulka ||----------+--------------------|| dbo | Datetime2Test || dbo | Datetime2Test2 || dbo | DatetimeoffsetTest || dbo | Jednotlivec || dbo | Povolání || dbo | Tým || dbo | TimeTest |+----------+--------------------+ (dotčených 7 řádků)