2010-10-12 19 views
204

Estoy trabajando en una aplicación que puede manejar múltiples servidores de bases de datos como "MySQL" y "MS SQL Server".¿Obtiene todos los nombres de tabla de una base de datos particular mediante consulta SQL?

Quiero obtener los nombres de las tablas de una base de datos particular utilizando una consulta general que debe ser adecuada para todos los tipos de bases de datos. He tratado siguiente:

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

pero es dar nombres de las tablas de todas las bases de datos de un servidor en particular, pero quiero conseguir mesas nombres de base de datos seleccionada solamente. ¿Cómo puedo restringir esta consulta para obtener tablas de una base de datos en particular?

+0

para MySQL se puede hacer simple. MOSTRAR TABLAS; –

Respuesta

330

Probablemente debido a la forma diferente trato DBMS SQL con los esquemas.

intente 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 el uso de DBA_TABLES.

+1

prefiero esta solución cuando tengo diferentes esquemas tabla dentro de una base de datos (SQL Server): SELECT CONCAT (TABLE_SCHEMA, TABLE_NAME ' ') DE INFORMATION_SCHEMA.TABLES DONDE TABLE_TYPE = 'Base de mesa' Y TABLE_CATALOG =' MyDB' –

+1

Uno debe usar ese ** DB ** en particular para obtener la información. 'USE dbName GO' para SQL-Server. Si no está utilizando ** DB **, el resultado no se mostrará, incluso si hay tablas en ese DB. – barnes

+0

Para Mysql puedes hacer lo simple. MOSTRAR TABLAS; –

20

La siguiente consulta seleccionará toda la Tables en la base de datos llamada DBName:

USE DBName 
GO 
SELECT * 
FROM sys.Tables 
GO 
+0

'Ir' es parte de la consulta ?? – Awan

+0

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

+1

USE DatabaseSample SELECT * FROM sys.Tables –

66

Robados de here:

USE YOURDBNAME 
GO 
SELECT * 
FROM sys.Tables 
GO 
+3

Lo más probable es SELECCIONAR Name FROM sys.Tables donde is_ms_shipped = 0 – om471987

+1

este es el proveedor de bases de datos específico, y no ANSI SQL compatible. – cjb110

+0

Alternativamente, SELECCIONE * DESDE su nombredb.sys.Tablas; si prefieres ser más conciso. Funciona en SQL Server, al menos. – buckminst

0

Sí oráculo es:

select * from user_tables 

Eso es si solo deseas objetos propiedad del registrado en user/schema lo contrario se puede utilizar all_tables o dba_tables que incluye las tablas del sistema.

+0

buscan consultas cruzadas de proveedores no específicas del proveedor. – cjb110

+0

No hay una manera consistente de hacer esto desde sql, ya que todos los motores de db implementan el diccionario de datos de manera diferente. Podría ser posible abstraer esto utilizando 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. La operación debe aclarar sus requisitos ... – kayakpim

13

Sólo hay que poner el DATABASE NAME frente a INFORMATION_SCHEMA.TABLES:

select table_name from YOUR_DATABASE.INFORMATION_SCHEMA.TABLES where TABLE_TYPE = 'BASE TABLE' 
12
USE DBName; 
SELECT * FROM sys.Tables; 

podemos tratar sin GO en el lugar del punto y coma puede utilizar ;.

+2

Para SQL Server en Azure, esto funcionó para mí, pero la respuesta aceptada no. Gracias. – Jonah

1
Exec sp_MSforeachtable 'Select ''?''' 
+0

Hola Amirreza, creo que estás hablando de 'sp_MSforeachtable'? – bummi

+0

@bummi: sí genial, gracias por la atención y lo siento por error de tipeo. Editado –

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

¿Alguna posibilidad de que pueda elaborar un poco sobre lo que quiere decir con esto? Quizás explicarlo? –

6

en MySQL, utilice:

SHOW TABLES; 

Después de seleccionar la base de datos con:

USE db_name 
0

Edificio de la respuesta de Michael Baylon, que necesitaba una lista que también incluye información de 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
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 esquemas múltiples en un servidor MS SQL, a continuación, seleccione-ing TABLE_NAME sin También se seleccionan simultáneamente TABLE_SCHEMA podría ser de beneficio limitado, por lo que he supuesto 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 SQL Server mía y con MySQL Workbench usando una base de datos MySQL, y en ambos casos da los nombres de la tabla.

La consulta basa dos consultas diferentes de Michael Baylon en una que 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 las bases de datos de 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 sola consulta que se puede ejecutar en cualquier servidor de base de datos.

2

Para Mysql puedes hacer lo simple. MOSTRAR TABLAS;

6

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

SELECT name FROM databaseName.sys.Tables; 
Cuestiones relacionadas