Jeśli kiedykolwiek będziesz musiał dowiedzieć się, czy baza danych zawiera tabele, które nie mają klucza podstawowego, możesz uruchomić dowolny z poniższych skryptów w SQL Server, aby zwrócić tylko te tabele.
Wszystkie te skrypty wykorzystują OBJECTPROPERTY()
funkcjonować. Ta funkcja akceptuje TableHasPrimaryKey
argument, który możesz sprawdzić pod kątem wartości 0
. Jeśli to 0
, tabela nie ma klucza podstawowego. Jeśli to 1
to robi. Dlatego możesz również użyć tej funkcji do zwrócenia wszystkich tabel z klucz podstawowy.
Skrypty te po prostu zwracają nazwę tabeli i jej schematu, ale zawsze możesz je zmodyfikować, aby zwracały więcej kolumn.
Opcja 1 – OBJECTPROPERTY() z sys.tables
sys.tables
widok systemowy jest prawdopodobnie najbardziej oczywistym miejscem do rozpoczęcia. Ten widok zwraca wiersz dla każdej tabeli użytkownika, a kiedy używamy OBJECTPROPERTY()
aby filtrować wyniki na podstawie TableHasPrimaryKey
właściwość będąca 0
, otrzymujemy tylko te tabele bez klucza podstawowego.
USE Test; SELECT SCHEMA_NAME (schema_id) AS [Schema], nazwa AS [Table] FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table];
Wynik:
Zmieniono kontekst bazy danych na 'Test'.+----------+--------------------+| Schemat | Tabela ||----------+--------------------|| dbo | DateTime2Test || dbo | DateTime2Test2 || dbo | Test przesunięcia daty i godziny || dbo | Indywidualne || dbo | Zawód || dbo | Zespół || dbo | TimeTest |+----------+--------------------+(7 wierszy dotyczy)
W tym przypadku moja obecna baza danych to baza testowa z kilkoma tabelami bez kluczy podstawowych.
Jeśli uruchomię tę samą instrukcję w innej bazie danych, nie otrzymuję żadnych wyników:
USE Music;SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table]FROM sys.tablesWHERE OBJECTPROPERTY(object_id, 'TableHasPrimaryKey') =0ORDER BY [Schema], [Table];
Wynik:
Zmieniono kontekst bazy danych na „Muzyka”. (0 wierszy dotyczy)
Opcja 2 – OBJECTPROPERTY() z INFORMATION_SCHEMA.TABLES
Ten przykład jest podobny do poprzedniego, z tą różnicą, że tym razem pytam o INFORMATION_SCHEMA.TABLES
pogląd. Widoki schematu informacji zawarte w SQL Server są zgodne ze standardową definicją ISO dla INFORMATION_SCHEMA.
USE Test;SELECT TABLE_SCHEMA, TABLE_NAMEFROM INFORMATION_SCHEMA.TABLESWHERE OBJECTPROPERTY(OBJECT_ID(CONCAT(TABLE_SCHEMA, '.', TABLE_NAME))),'TableHasPrimaryKey') =0 ANDTABLE_TYPE='BASE TABLE'ORDER BY TABLE_NAME;
Wynik:
Zmieniono kontekst bazy danych na 'Test'.+----------------+--------------------+ | TABLE_SCHEMA | TABLE_NAME ||----------------+---------------------|| dbo | DateTime2Test || dbo | DateTime2Test2 || dbo | Test przesunięcia daty i godziny || dbo | Indywidualne || dbo | Zawód || dbo | Zespół || dbo | TimeTest |+----------------+--------------------+(7 wierszy dotyczy)
Opcja 3 – OBJECTPROPERTY() z sys.objects
W tym przykładzie wysyłam zapytanie do sys.objects
pogląd. Jest to bardziej ogólny widok w porównaniu z poprzednimi dwoma i zwraca informacje o obiektach o zakresie schematu (nie tylko tabel). Z tego powodu musimy filtrować wyniki za pomocą type = 'U'
. U
tutaj oznacza tabelę zdefiniowaną przez użytkownika.
Ponownie możemy użyć OBJECTPROPERTY()
funkcja filtrowania wyników tylko do tych tabel, które nie mają klucza podstawowego.
USE Test; SELECT SCHEMA_NAME (schema_id) AS [Schema], name AS [Table] FROM sys.objects WHERE type ='U'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', nazwa)) , 'TableHasPrimaryKey') =0ORDER BY [Schema], [Tabela]
Wynik:
Zmieniono kontekst bazy danych na 'Test'.+----------+--------------------+| Schemat | Tabela ||----------+--------------------|| dbo | DateTime2Test || dbo | DateTime2Test2 || dbo | Test przesunięcia daty i godziny || dbo | Indywidualne || dbo | Zawód || dbo | Zespół || dbo | TimeTest |+----------+--------------------+(7 wierszy dotyczy)
Możemy alternatywnie filtrować go według type_desc = 'USER_TABLE'
, co dałoby ten sam wynik.
USE Test;SELECT SCHEMA_NAME(schema_id) AS [Schema], name AS [Table]FROM sys.objects WHERE type_desc ='USER_TABLE'AND OBJECTPROPERTY(OBJECT_ID(CONCAT(SCHEMA_NAME(schema_id), '.', nazwa)) , 'TableHasPrimaryKey') =0ORDER BY [Schema], [Tabela]
Wynik:
Zmieniono kontekst bazy danych na 'Test'.+----------+--------------------+| Schemat | Tabela ||----------+--------------------|| dbo | DateTime2Test || dbo | DateTime2Test2 || dbo | Test przesunięcia daty i godziny || dbo | Indywidualne || dbo | Zawód || dbo | Zespół || dbo | TimeTest |+----------+--------------------+(7 wierszy dotyczy)