sql >> Database teknologi >  >> RDS >> Sqlserver

7 måder at returnere alle tabeller med udenlandske nøgler i SQL Server

Denne artikel tilbyder syv måder at returnere alle tabeller, der har fremmednøgler i en database i SQL Server.

Hver tabel returneres kun én gang, uanset hvor mange fremmednøgler den måtte have. Dette er anderledes end at returnere alle fremmednøgler sammen med deres tabeller. Hvis du vil gøre det, se 11 måder at returnere fremmede nøgler i SQL Server.

Alle eksempler her forespørger i den samme database og returnerer derfor det samme resultat.

Mulighed 1 – OBJECTPROPERTY() med sys.tables

Den første mulighed er at bruge OBJECTPROPERTY() funktion, når du forespørger sys.tables systemvisning.

Denne funktion accepterer en TableHasForeignKey argument, som enten vil være 1 eller 0 (eller NULL ). Hvis det er 1 , betyder det, at tabellen har en fremmednøgle. En værdi på 0 betyder, at den ikke har nogen fremmednøgler. Derfor kan vi bruge dette i en WHERE klausul for kun at returnere de tabeller, hvor TableHasForeignKey er indstillet til 1 .

VÆLG SCHEMA_NAME(schema_id) AS [Skema], navn AS [Tabel]FRA sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasForeignKey') =1ORDER BY [Skema], [Tabel];

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+

Mulighed 2 – OBJECTPROPERTY() med INFORMATION_SCHEMA.TABLES

Dette eksempel bruger OBJECTPROPERTY() når du forespørger på INFORMATION_SCHEMA.TABLES systemvisning.

VÆLG TABLE_SCHEMA, TABLE_NAMEFRA INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME)),'TableHasForeignKey') =1 ANDTABLE_TYPE='BASE_SCHEMA TABLE,forudgående_NAVN TABLE, 

Resultat:

+----------------+--------------+| TABLE_SCHEMA | TABLE_NAME ||----------------+--------------|| dbo | Albums || dbo | Kunstnere |+----------------+-------------+

Mulighed 3 – OBJECTPROPERTY() med sys.objects

Her er endnu en mulighed, der bruger OBJECTPROPERTY() . Denne gang bruger jeg det, når jeg forespørger på sys.objects systemvisning.

VÆLG SCHEMA_NAME(schema_id) AS [Skema], navn AS [Table]FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', name)), 'TableHasForeignKey ') =1 BESTIL EFTER [Skema], [Tabel]

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+

Mulighed 4 – INFORMATION_SCHEMA.TABLE_CONSTRAINTS med DISTINCT

Her er et eksempel, der forespørger INFORMATION_SCHEMA.TABLE_CONSTRAINTS systemvisning, hvor begrænsningstypen er FOREIGN KEY . I dette tilfælde bruger jeg også DISTINCT klausul for at forhindre, at tabeller returneres mere end én gang, når de har mere end én fremmednøgle.

VÆLG DISTINCT CONSTRAINT_SCHEMA, TABLE_NAME FRA INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='FREIGN KEY';

Resultat:

+----------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Albums || dbo | Kunstnere |+---------------------+--------------+

Her er, hvad der sker, hvis jeg fjerner DISTINCT klausul:

VÆLG CONSTRAINT_SCHEMA, TABLE_NAME FRA INFORMATION_SCHEMA.TABLE_CONSTRAINTSHVERE CONSTRAINT_TYPE ='FREIGN KEY';

Resultat:

+----------------------+--------------+| CONSTRAINT_SCHEMA | TABLE_NAME ||---------------------+-------------------|| dbo | Albums || dbo | Albums || dbo | Kunstnere |+---------------------+--------------+

I dette tilfælde Albums tabel har to fremmednøgler, så jeg får to rækker for den ene tabel.

Mulighed 5 – sys.foreign_keys med DISTINCT

Her er et andet eksempel, der bruger DISTINCT klausul, men denne gang forespørger jeg på sys.foreign_keys systemvisning.

VÆLG DISTINCT OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Tabel]FRA sys.foreign_keys AS fkORDER BY [Skema], [Tabel];

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+

Og her er den uden DISTINCT klausul:

VÆLG OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Schema], OBJECT_NAME(fk.parent_object_id) AS [Tabel]FRA sys.foreign_keys AS fkORDER BY [Skema], [Tabel];

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Albums || dbo | Kunstnere |+----------+---------+

Mulighed 6 – sys.foreign_keys med GROUP BY

Denne ligner det forrige eksempel, idet den forespørger på sys.foreign_keys systemvisning. Forskellen er, at snarere end at bruge DISTINCT klausulen bruger den GROUP BY klausul i stedet for.

VÆLG OBJECT_SCHEMA_NAME(fk.parent_object_id) AS [Skema], OBJECT_NAME(fk.parent_object_id) AS [Tabel]FRA sys.foreign_keys AS fkGROUP BY OBJECT_SCHEMA_NAME(fk.parent_object_id), OBJECT_Object_id.
 Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+

Mulighed 7 – OBJECTPROPERTYEX()

Dette eksempel kan være en fordobling af nogle tidligere eksempler, men det er stadig værd at nævne.

Ethvert af de foregående eksempler, der bruger OBJECTPROPERTY() funktion, kunne nemt omskrives til at bruge OBJECTPROPERTYEX() fungere. Denne funktion er grundlæggende en udvidelse til OBJECTPROPERTY() , og det gør alt OBJECTPROPERTY() gør og mere.

Så jeg kunne omskrive det første eksempel på denne side med følgende:

VÆLG SCHEMA_NAME(schema_id) AS [Skema], navn AS [Tabel]FRA sys.tablesWHERE OBJECTPROPERTYEX(object_id, 'TableHasForeignKey') =1ORDER BY [Skema], [Tabel];

Resultat:

+----------+---------+| Skema | Tabel ||----------+---------|| dbo | Albums || dbo | Kunstnere |+----------+---------+

En forskel, du bør vide om, er, at disse to funktioner returnerer forskellige returtyper. OBJECTPROPERTY() returnerer en int hvorimod OBJECTPROPERTYEX() returnerer en sql_variant type.


  1. DATEADD-ækvivalent i PostgreSQL

  2. Hvordan henter jeg JSON-data fra MySQL?

  3. SQL WHERE Flere betingelser

  4. SQL Server 2008 tusinde separator for en kolonne