Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

3 sposoby na zwrócenie wszystkich tabel BEZ klucza podstawowego w SQL Server

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)

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Przykładowe zapytanie dotyczące serwera połączonego z serwerem SQL

  2. Jak niejawne transakcje działają w SQL Server

  3. Jak generować skrypty DDL (tworzenie) z SQL Server Management Studio (SSMS) — SQL Server / TSQL Tutorial, część 17

  4. Jak pobrać liczbę wierszy dla wszystkich tabel w bazie danych SQL SERVER?

  5. Przygotuj nową maszynę wirtualną dla SQL Server 2014 CTP1