¿Obtener todos los nombres de tabla de una base de datos particular por consulta SQL?


304

Estoy trabajando en una aplicación que puede manejar múltiples servidores de bases de datos como "MySQL" y "MS SQL Server".

Quiero obtener los nombres de las tablas de una base de datos particular usando una consulta general que debería ser adecuada para todos los tipos de bases de datos. He intentado lo siguiente:

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

Pero está dando nombres de tablas de todas las bases de datos de un servidor en particular, pero quiero obtener solo nombres de tablas de la base de datos seleccionada. ¿Cómo puedo restringir esta consulta para obtener tablas de una base de datos en particular?


1
Para Mysql puedes hacer simple. MOSTRAR TABLAS;
Ashish Gupta

Respuestas:


500

Probablemente debido a la forma en que diferentes sql dbms manejan los esquemas.

Intenta lo siguiente

Para SQL Server:

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

Para MySQL:

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

Para Oracle, creo que el equivalente sería usar DBA_TABLES.


3
Prefiero esta solución cuando tengo diferentes esquemas de tabla dentro de una base de datos (SQL Server): SELECCIONE CONCAT (TABLE_SCHEMA, '.', TABLE_NAME) FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE = 'BASE TABLE' AND TABLE_CATALOG = 'MyDB'
Verena Haunschmid

3
Uno debe estar usando ese DB en particular para obtener la información. USE dbName GOpara SQL Server. Si no está utilizando la base de datos , el resultado no se mostrará, incluso si hay tablas en esa base de datos.
barnes

2
Para Mysql puedes hacer simple. MOSTRAR TABLAS;
Ashish Gupta

La entrada de SQL Server funciona bien para mí sin el USE dbName GOprefijo en Server 2014.
Mmm,

1) Usted ha sugerido lo mismo para un Servidor SQL y MySQL 2) INFORMACIÓN_SQUEMA.TABLES existe solo en MySQL 3) Realmente me pregunto cómo es que obtuvo tantos votos positivos para esto ...
Apostolos

82

Robado de aquí :

USE YOURDBNAME
GO 
SELECT *
FROM sys.Tables
GO

3
Lo más probable es que SELECT Name from sys. Tablas donde is_ms_shipped = 0
om471987

1
esto es específico del proveedor de la base de datos y no es compatible con ANSI SQL.
cjb110

1
Alternativamente, SELECCIONE * DE yourdbname.sys.Tables; si prefieres ser más conciso Funciona en SQL Server, al menos.
buckminst

29

La siguiente consulta seleccionará todo Tablesen la base de datos llamada DBName:

USE DBName
GO 
SELECT *
FROM sys.Tables
GO

NO solo separador de parte. puede cambiar a otro. No es una sintaxis T-SQL.
anishMarokey

1
USE DatabaseSample SELECT * FROM sys.Tables
Hamzeh Soboh

17
USE DBName;
SELECT * FROM sys.Tables;

Podemos tratar sin su GOlugar puede utilizar punto ;y coma .


3
Para SQL Server en Azure, esto funcionó para mí, pero la respuesta aceptada no. Gracias.
Jonás

14

Solo pon el DATABASE NAMEfrente de INFORMATION_SCHEMA.TABLES:

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

10

En mysql, use:

SHOW TABLES;

Después de seleccionar el DB con:

USE db_name

Osm ,,, swt n short
Deepa MG

Esto es MySQL, la pregunta está etiquetada con el servidor MSSQL
Melle

@Melle Mira la descripción de la pregunta
Lorenzo Lerate

Esta no es la mejor respuesta, vea mi comentario debajo de la respuesta aceptada (y correcta).
Chiwda

6

No vi esta respuesta, pero bueno, esto es lo que hago:

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

¿Alguna posibilidad de que puedas explicar un poco lo que quieres decir con esto? ¿Quizás explicarlo?
Alex K

1
Exec sp_MSforeachtable 'Select ''?'''

Hola Amirreza, creo que estás hablando sp_MSforeachtable.
bummi

@bummi: sí genial, gracias por la atención y perdón por escribir error. Editado
Amir Keshavarz

1
USE dbName;

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

Si está trabajando con múltiples esquemas en un servidor MS SQL, entonces SELECCIONAR TABLE_NAME sin seleccionar simultáneamente TABLE_SCHEMA podría ser de beneficio limitado, por lo que asumí que estamos interesados ​​en las tablas que pertenecen a un esquema conocido cuando se usa MS SQL Server.

He probado la consulta anterior con SQL Server Management Studio usando una base de datos mía de SQL Server y con MySQL Workbench usando una base de datos MySQL, y en ambos casos da los nombres de las tablas.

La consulta combina las dos consultas diferentes de Michael Baylon en una que luego puede ejecutarse en cualquier tipo de base de datos. La primera parte de la cláusula WHERE funciona en bases de datos MySQL y la segunda parte (después del OR) funciona en bases de datos MS SQL Server. Es feo y lógicamente un poco incorrecto, ya que supone que no hay un esquema no deseado con el mismo nombre que la base de datos. Esto podría ayudar a alguien que esté buscando una única consulta que pueda ejecutarse en cualquiera de los servidores de bases de datos.


1

ACTUALIZACIÓN PARA LA ÚLTIMA VERSIÓN DEL SERVIDOR MSSQL (17.7)

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

O SELECT *para obtener todas las columnas.


Me acabo de dar cuenta de que esta consulta da un resultado incorrecto para los caracteres que no están en inglés en el nombre de la tabla, mientras que Michael Baylon da los resultados correctos. (el carácter estaba en minúscula en turco "ı")
onur demir

1

Para seleccionar la consulta de la base de datos a continuación:

use DatabaseName

Ahora

SELECT * FROM INFORMATION_SCHEMA.TABLES

Ahora puede ver las tablas creadas a continuación en la consola.

PFA

Consulta


0

Si oráculo es:

select * from user_tables

Es decir, si solo desea los objetos que son propiedad de los que han iniciado sesión, de lo user/schemacontrario, puede usarlos all_tableso dba_tablesincluir tablas del sistema.


buscan consultas de proveedores cruzados que no sean específicos del proveedor.
cjb110

No hay una manera consistente de hacer esto desde sql, ya que todos los motores db implementan el diccionario de datos de manera diferente. Podría ser posible resumir esto usando jdbc / odbc y un lenguaje 3GL como C / Java / C # si este es un requisito programático, definitivamente posible si tiene una implementación diferente para cada base de datos. El
operador

0

Partiendo de la respuesta de Michael Baylon, necesitaba una lista que también incluyera la información del esquema y así es como modifiqué su consulta.

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

En nuestro código Oracle DB (PL / SQL) a continuación, trabajamos para obtener la lista de todas las tablas existentes en nuestro DB.

select * from tab;

y

select table_name from tabs;

Ambos están trabajando. Intentemos encontrar el tuyo.


0

Simplemente obtenga toda la información de improtanat con este SQL a continuación en 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;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.