Jak uzyskać listę wszystkich tabel w bazie danych przy użyciu TSQL?


Odpowiedzi:


1429

SQL Server 2000, 2005, 2008, 2012, 2014, 2016, 2017 lub 2019:

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

Aby wyświetlić tylko tabele z określonej bazy danych

SELECT TABLE_NAME 
FROM <DATABASE_NAME>.INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE'

Lub,

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE = 'BASE TABLE' 
    AND TABLE_CATALOG='dbName' --(for MySql, use: TABLE_SCHEMA='dbName' )

PS: dla SQL Server 2000:

SELECT * FROM sysobjects WHERE xtype='U' 

46
Należy pamiętać, że obejmie to również WYŚWIETLENIA, nie tylko stoły
Nathan Koop,

17
Dodaj nazwę bazy danych, jeśli nie korzystasz z konkretnej bazy danych, więc będzie to WYBIERZ TABLE_NAME OD <DATABASE_NAME> .INFORMATION_SCHEMA.Tabele
Shriroop

22
Dodanie WHERE TABLE_TYPE='BASE TABLE'obejmie tylko tabele podstawowe (a przez rozszerzenie możesz zawsze korzystać WHERE TABLE_TYPE != 'VIEW').
Phillip Copley,

3
„sysdiagrams” pojawia się również na tej liście :(
celsowm

4
sysdiagrams jest normalną tabelą, zawsze musisz wykluczyć ją ręcznie za pomocą AND name <> 'sysdiagrams'.
Christoph

199
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'

Oto lista innych typów obiektów, których możesz szukać:

  • AF: funkcja agregująca (CLR)
  • C: Sprawdź ograniczenie
  • D: Ograniczenie domyślne lub domyślne
  • F: KLUCZ ZAGRANICZNY
  • L: Log
  • FN: funkcja skalarna
  • FS: Funkcja skalarna zestawu (CLR)
  • FT: Funkcja wartościowana w tabeli asemblera (CLR)
  • IF: Funkcja tabeli w linii
  • IT: wewnętrzny stół
  • P: Procedura składowana
  • PC: procedura składowana zestawu (CLR)
  • PK: ograniczenie KLUCZ PODSTAWOWY (typ to K)
  • RF: procedura przechowywana filtra replikacji
  • S: Tabela systemowa
  • SN: Synonim
  • SQ: Kolejka serwisowa
  • TA: wyzwalacz DML zestawu (CLR)
  • TF: funkcja tabeli
  • TR: wyzwalacz SQL DML
  • TT: Rodzaj stołu
  • U: Tabela użytkowników
  • UQ: ograniczenie UNIKALNE (typ to K)
  • V: Zobacz
  • X: Rozszerzona procedura składowana

9
Aliasing jest nieco zbędny: SELECT name FROM sysobjects WHERE xtype = 'U'zrobiłby to samo.
PJSCopeland

Dzięki, początkowo próbowałem tego z wieloma instrukcjami select dla PK,FK,D,C,V,UQetc, aby porównać źródłową i docelową bazę danych, ale potem znalazłem funkcję w VS, ale czy nie sql queryma porównania pełnej i źródłowej bazy danych?
shaijut

Można się zastanawiać, dlaczego 'U'używa się go do identyfikacji tabeli użytkowników ... w przeciwieństwie do być może 'UT'lub, najbardziej intuicyjnie, 'T'... Ach, to działa!
user919426

87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

LUB

SELECT * FROM Sys.Tables

5
Tylko uwaga, że ​​(jak wspomniano w innych odpowiedziach) tabele sys.tab są dostępne tylko w 2005 r.
Rob

2
Co nie jest problemem w 2018 roku. Myślę, że powinno być wyżej :-)
Michał B.,

29
USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO

LUB

USE YourDBName
GO
SELECT * FROM INFORMATION_SCHEMA.TABLES 
GO

11
SELECT * FROM information_schema.tables
where TABLE_TYPE = 'BASE TABLE'

SQL Server 2012



9
SELECT name 
FROM sysobjects 
WHERE xtype='U' 
ORDER BY name;

(SQL Server 2000 standard; nadal obsługiwany w SQL Server 2005.)



6
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U' 

SELECT name FROM sysobjects WHERE xtype='U' AND name <> 'sysdiagrams'; ponieważ tabela sysdiagrams, choć utworzona przez Microsoft SQL Server Management Studio, technicznie nie jest tabelą systemową, ale taką, którą zwykle lubimy wykluczać.
Christoph

5

Minusem INFORMATION_SCHEMA.TABLESjest to, że zawiera również tabele systemowe, takie jak dtpropertiesi MSpeer_...tabele, bez możliwości odróżnienia ich od własnych tabel.

Polecam użycie sys.objects(nowej wersji przestarzałego widoku sysobjects ), który obsługuje wykluczanie tabel systemowych:

select *
from sys.objects
where type = 'U'      -- User tables
and is_ms_shipped = 0 -- Exclude system tables

2

W SSMS, aby uzyskać wszystkie w pełni kwalifikowane nazwy tabel w określonej bazie danych (np. „MyDatabase”):

SELECT [TABLE_CATALOG] + '.' + [TABLE_SCHEMA] + '.' + [TABLE_NAME]
FROM   MyDatabase.INFORMATION_SCHEMA.Tables
WHERE  [TABLE_TYPE] = 'BASE TABLE' and [TABLE_NAME] <> 'sysdiagrams'
ORDER BY [TABLE_SCHEMA], [TABLE_NAME]

Wyniki:

  • MyDatabase.dbo.MyTable1
  • MyDatabase.dbo.MyTable2
  • MyDatabase.MySchema.MyTable3
  • MyDatabase.MySchema.MyTable4
  • itp.

2

Proszę użyć tego. Otrzymasz nazwy tabel wraz z nazwami schematów:

SELECT SYSSCHEMA.NAME, SYSTABLE.NAME
FROM SYS.tables SYSTABLE
INNER JOIN SYS.SCHEMAS SYSSCHEMA
ON SYSTABLE.SCHEMA_ID = SYSSCHEMA.SCHEMA_ID

1
SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES 
WHERE TABLE_TYPE='BASE TABLE' 
ORDER BY TABLE_NAME

1

Dzięki Ray Vega, którego odpowiedź podaje wszystkie tabele użytkowników w bazie danych ...

exec sp_msforeachtable 'print' '?' '

sp_helptext pokazuje bazowe zapytanie, które podsumowuje do ...

select * from dbo.sysobjects o 
join sys.all_objects syso on o.id =  syso.object_id  
where OBJECTPROPERTY(o.id, 'IsUserTable') = 1 
and o.category & 2 = 0 

1

Możesz użyć sys.objects, aby uzyskać wszystkie obiekty bazy danych.

 GO
 select * from sys.objects where type_desc='USER_TABLE' order by name
 GO

LUB

--  For all tables
select * from INFORMATION_SCHEMA.TABLES 
GO 

  --- For user defined tables
select * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='BASE TABLE'
GO

  --- For Views
select * from INFORMATION_SCHEMA.TABLES where TABLE_TYPE='VIEW'
GO

0
--for oracle
select tablespace_name, table_name from all_tables;

Ten link może dostarczyć znacznie więcej informacji na ten temat


2
To nie dotyczy SQL Server, więc nie jest odpowiedzią na to pytanie.
Dan Getz

0

Używanie SELECT * FROM INFORMATION_SCHEMA.COLUMNSpokazuje również wszystkie tabele i powiązane kolumny.

Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.