Uzyskaj wszystkie nazwy tabel dla konkretnej bazy danych według zapytania SQL?


304

Pracuję nad aplikacją, która może obsługiwać wiele serwerów baz danych, takich jak „MySQL” i „MS SQL Server”.

Chcę uzyskać nazwy tabel konkretnej bazy danych za pomocą ogólnego zapytania, które powinno być odpowiednie dla wszystkich typów baz danych. Próbowałem następujące:

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

Podaje jednak nazwy tabel wszystkich baz danych konkretnego serwera, ale chcę uzyskać tylko nazwy tabel wybranych baz danych. Jak mogę ograniczyć to zapytanie, aby uzyskać tabele konkretnej bazy danych?


1
W Mysql możesz zrobić to proste. POKAŻ TABELE;
Ashish Gupta,

Odpowiedzi:


500

Prawdopodobnie ze względu na sposób, w jaki różne sqm dbms radzą sobie ze schematami.

Spróbuj wykonać następujące czynności

W przypadku programu SQL Server:

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG='dbName'

W przypadku MySQL:

SELECT TABLE_NAME 
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_SCHEMA='dbName' 

Wydaje mi się, że w przypadku Oracle będzie to odpowiednik DBA_TABLES.


3
Wolę to rozwiązanie, gdy mam różne schematy tabel w ramach jednej bazy danych (SQL Server): WYBIERZ CONCAT (TABLE_SCHEMA, '.', TABLE_NAME) FROM INFORMACJE_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'MyDB'
Verena Haunschmid

3
Aby uzyskać informacje, należy użyć tej konkretnej bazy danych. USE dbName GOdla serwera SQL. Jeśli nie korzystasz z bazy danych , wynik nie zostanie wyświetlony, nawet jeśli w tej bazie danych znajdują się tabele.
barnes

2
W Mysql możesz zrobić to proste. POKAŻ TABELE;
Ashish Gupta,

Wpis SQL Server działa dla mnie dobrze bez USE dbName GOprefiksu na serwerze 2014.
Mmm

1) Zasugerowałeś to samo dla SQL Servera i MySQL 2) INFORMACJE_SCHEMA.TABLES istnieje tylko w MySQL 3) Naprawdę zastanawiam się, skąd masz tyle głosów na ten temat ...
Apostolos

82

Skradziono stąd :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
Najprawdopodobniej WYBIERZ Nazwę z sys.Tables gdzie is_ms_shipped = 0
om471987

1
jest to specyficzne dla dostawcy bazy danych i niezgodne z ANSI SQL.
cjb110

1
Alternatywnie, WYBIERZ * Z twojnazwa_pliku.sys.Tables; jeśli wolisz być bardziej zwięzły. Działa przynajmniej w SQL Server.
buckminst

29

Następujące zapytanie wybierze wszystkie Tablesw bazie danych o nazwie DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

NIE to tylko część separatora. możesz zmienić na inny. To nie jest składnia T-SQL.
anishMarokey

1
UŻYJ DatabaseSample SELECT * FROM sys.Tables
Hamzeh Soboh

17
USE DBName;
SELECT * FROM sys.Tables;

Możemy radzić sobie bez GOciebie zamiast średnika ;.


3
W przypadku SQL Server na platformie Azure zadziałało to dla mnie, ale zaakceptowana odpowiedź nie. Dzięki.
Jonasz

14

Wystarczy umieścić DATABASE NAMEprzed INFORMATION_SCHEMA.TABLES:

select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE'

10

W mysql użyj:

SHOW TABLES;

Po wybraniu DB za pomocą:

USE db_name

Osm ,,, swt n short
Deepa MG

To jest MySQL, pytanie jest oznaczone jako serwer MSSQL
Melle,

@Melle Spójrz na opis pytania
Lorenzo Lerate

To nie jest najlepsza odpowiedź, zobacz mój komentarz pod zaakceptowaną (i poprawną) odpowiedzią.
Chiwda

6

Nie widziałem tej odpowiedzi, ale hej, oto co robię:

SELECT name FROM databaseName.sys.Tables;


2
select * from sys.tables
order by schema_id      --comments: order by 'schema_id' to get the 'tables' in 'object explorer order'
go

Czy jest jakaś szansa, aby rozwinąć nieco to, co masz na myśli? Może to wytłumaczysz?
Alex K

1
Exec sp_MSforeachtable 'Select ''?'''

Cześć Amirreza, myślę, że mówisz sp_MSforeachtable?
bummi

@bummi: tak świetnie, dziękuję za uwagę i przepraszam za błąd w pisaniu. Edytowane
Amir Keshavarz,

1
USE dbName;

SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE (TABLE_SCHEMA = 'dbName' OR TABLE_SCHEMA = 'schemaName')
ORDER BY TABLE_NAME

Jeśli pracujesz z wieloma schematami na serwerze MS SQL, to WYBÓR TABELI bez jednoczesnego wybrania TABELI_SCHEMA może mieć ograniczoną korzyść, więc założyłem, że interesują nas tabele należące do znanego schematu podczas korzystania z MS SQL Server.

Testowałem powyższe zapytanie w SQL Server Management Studio przy użyciu mojej bazy danych SQL Server oraz w MySQL Workbench przy użyciu bazy danych MySQL, aw obu przypadkach podaje nazwy tabel.

Kwerenda dzieli dwa różne zapytania Michaela Baylona w jedno, które można następnie uruchomić na dowolnym typie bazy danych. Pierwsza część klauzuli WHERE działa na bazach danych MySQL, a druga część (po OR) działa na bazach danych MS SQL Server. Jest brzydka i logicznie trochę niepoprawna, ponieważ zakłada, że ​​nie ma niepożądanego schematu o takiej samej nazwie jak baza danych. Może to pomóc komuś, kto szuka jednego zapytania, które można uruchomić na dowolnym serwerze bazy danych.


1

AKTUALIZACJA NAJNOWSZEJ WERSJI SERWERA MSSQL (17.7)

SELECT name FROM sys.Tables WHERE type_desc = 'USER_TABLE'

Lub SELECT *uzyskać wszystkie kolumny.


Właśnie zdałem sobie sprawę, że to zapytanie daje zły wynik dla znaków nieanglojęzycznych w nazwie tabeli, podczas gdy Michael Baylon podaje prawidłowe wyniki. (znak był w języku tureckim małymi literami „ı”)
onur demir

1

Aby wybrać zapytanie do bazy danych poniżej:

use DatabaseName

Teraz

SELECT * FROM INFORMATION_SCHEMA.TABLES

Teraz możesz zobaczyć utworzone tabele poniżej w konsoli.

PFA.

Pytanie


0

Tak, wyrocznia to:

select * from user_tables

To znaczy, jeśli chcesz tylko obiektów należących do zalogowanego, w user/schemaprzeciwnym razie możesz użyć all_tableslub dba_tablesktóry zawiera tabele systemowe.


szukają zapytań różnych dostawców, a nie konkretnych dostawców.
cjb110

Nie ma spójnego sposobu, aby to zrobić z SQL, ponieważ wszystkie silniki db implementują słownik danych inaczej. Może to być abstrakcyjne za pomocą jdbc / odbc i języka 3GL, takiego jak C / Java / C #, jeśli jest to wymaganie programowe, zdecydowanie możliwe, jeśli masz inną implementację dla każdej bazy danych. Operacja powinna wyjaśnić swoje wymagania ...
kayakpim

0

Opierając się na odpowiedzi Michaela Baylona, ​​potrzebowałem listy zawierającej również informacje o schemacie i tak zmodyfikowałem jego zapytanie.

SELECT TABLE_SCHEMA + '.' + TABLE_NAME as 'Schema.Table'
  FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'dbName'
  ORDER BY TABLE_SCHEMA, TABLE_NAME

0

W naszym Oracle DB (PL / SQL) poniższy kod działa, aby uzyskać listę wszystkich istniejących tabel w naszym DB.

select * from tab;

i

select table_name from tabs;

oba działają. spróbujmy znaleźć twoje.


0

Po prostu uzyskaj wszystkie informacje o improtanacie za pomocą poniższego kodu SQL w MySQL

    SELECT t.TABLE_NAME , t.ENGINE , t.TABLE_ROWS ,t.AVG_ROW_LENGTH, 
t.INDEX_LENGTH FROM 
INFORMATION_SCHEMA.TABLES as t where t.TABLE_SCHEMA = 'YOURTABLENAMEHERE' 
order by t.TABLE_NAME ASC limit 10000;
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.