sql >> Databasteknik >  >> RDS >> Sqlserver

7 sätt att returnera alla tabeller med främmande nycklar i SQL Server

Den här artikeln erbjuder sju sätt att returnera alla tabeller som har främmande nycklar i en databas i SQL Server.

Varje tabell returneras bara en gång, oavsett hur många främmande nycklar den kan ha. Detta skiljer sig från att returnera alla främmande nycklar, tillsammans med deras tabeller. Om du vill göra det, se 11 sätt att returnera främmande nycklar i SQL Server.

Alla exempel här frågar efter samma databas och returnerar därför samma resultat.

Alternativ 1 – OBJECTPROPERTY() med sys.tables

Det första alternativet är att använda OBJECTPROPERTY() funktion när du frågar sys.tables systemvy.

Den här funktionen accepterar en TableHasForeignKey argument, som kommer att vara antingen 1 eller 0 (eller NULL ). Om det är 1 , betyder detta att tabellen har en främmande nyckel. Ett värde på 0 betyder att den inte har några främmande nycklar. Därför kan vi använda detta i en WHERE sats för att endast returnera de tabeller där TableHasForeignKey är inställd på 1 .

VÄLJ SCHEMA_NAME(schema_id) AS [Schema], namn AS [Table]FRÅN sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Table];

Resultat:

+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+

Alternativ 2 – OBJECTPROPERTY() med INFORMATION_SCHEMA.TABLES

Det här exemplet använder OBJECTPROPERTY() när du frågar efter INFORMATION_SCHEMA.TABLES systemvy.

VÄLJ TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') =1 ANDTABLE_TYPE='BASE_SCHEMA TABLE,BASE_SCHEMA TABLE;

Resultat:

+----------------+-------------+| TABLE_SCHEMA | TABLE_NAME ||----------------+-------------|| dbo | Album || dbo | Artister |+----------------+-------------+

Alternativ 3 – OBJECTPROPERTY() med sys.objects

Här är ytterligare ett alternativ som använder OBJECTPROPERTY() . Den här gången använder jag det när jag frågar sys.objects systemvy.

VÄLJ SCHEMA_NAME(schema_id) AS [Schema], namn AS [Table]FRÅN sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey ') =1ORDER EFTER [Schema], [Tabell]

Resultat:

+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+

Alternativ 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS med DISTINCT

Här är ett exempel som frågar efter INFORMATION_SCHEMA.TABLE_CONSTRAINTS systemvy där begränsningstypen är FOREIGN KEY . I det här fallet använder jag också DISTINCT klausul för att förhindra att tabeller returneras mer än en gång när de har mer än en främmande nyckel.

VÄLJ DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME FRÅN INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='FREIGN KEY';

Resultat:

+----------------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Album || dbo | Artister |+---------------------+--------------+

Så här händer om jag tar bort DISTINCT klausul:

VÄLJ CONSTRAINT_SCHEMA, TABLE_NAME FRÅN INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='FREIGN KEY';

Resultat:

+----------------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Album || dbo | Album || dbo | Artister |+---------------------+--------------+

I det här fallet Albums tabellen har två främmande nycklar, så jag får två rader för den ena tabellen.

Alternativ 5 – sys.foreign_keys med DISTINCT

Här är ett annat exempel som använder DISTINCT klausul, men den här gången frågar jag efter sys.foreign_keys systemvy.

VÄLJ DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FRÅN sys.foreign_keys AS fkORDER BY [Schema], [Table];

Resultat:

+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+

Och här är den utan DISTINCT klausul:

VÄLJ OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FRÅN sys.foreign_keys AS fkORDER BY [Schema], [Table];

Resultat:

+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Album || dbo | Artister |+----------+---------+

Alternativ 6 – sys.foreign_keys med GROUP BY

Den här liknar det föregående exemplet genom att den frågar efter sys.foreign_keys systemvy. Skillnaden är att snarare än att använda DISTINCT satsen använder den GROUP BY klausul istället.

VÄLJ OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Table]FRÅN sys.foreign_keys AS fkGROUP BY OBJECT_SCHEMA_NAME(fk.parent_object_id), OBJECT_parent.>(fk); 

Resultat:

+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+

Alternativ 7 – OBJECTPROPERTYEX()

Det här exemplet kan vara en fördubbling av några tidigare exempel, men det är fortfarande värt att nämna.

Något av de tidigare exemplen som använder OBJECTPROPERTY() funktion, kan enkelt skrivas om för att använda OBJECTPROPERTYEX() fungera. Denna funktion är i grunden ett tillägg till OBJECTPROPERTY() , och den gör allt OBJECTPROPERTY() gör och mer.

Så jag skulle kunna skriva om det första exemplet på den här sidan med följande:

VÄLJ SCHEMA_NAME(schema_id) SOM [Schema], namn SOM [Table]FRÅN sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') =1ORDER BY [Schema], [Table];

Resultat:

+----------+---------+| Schema | Tabell ||---------+---------|| dbo | Album || dbo | Artister |+----------+---------+

En skillnad du bör känna till är att dessa två funktioner returnerar olika returtyper. OBJECTPROPERTY() returnerar en int medan OBJECTPROPERTYEX() returnerar en sql_variant typ.


  1. Få storlek på alla tabeller i databasen

  2. Betydelsen av Oracles dump(systimestamp) bytes

  3. SQL Server SHOWPLAN_ALL

  4. Oracle Infoga Välj med beställning efter