Come posso ottenere un elenco di tutte le tabelle in un database usando TSQL?


Risposte:


1429

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

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

Per mostrare solo tabelle da un determinato database

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

O,

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

PS: per SQL Server 2000:

SELECT * FROM sysobjects WHERE xtype='U' 

46
Questo includerà anche VISUALIZZAZIONI, non solo tabelle
Nathan Koop,

17
Aggiungi il nome del database se non stai utilizzando il database specifico, quindi sarà SELECT TABLE_NAME FROM <DATABASE_NAME> .INFORMATION_SCHEMA.Tables
Shriroop

22
L'aggiunta WHERE TABLE_TYPE='BASE TABLE'includerà solo le tabelle di base (e per estensione è sempre possibile utilizzare WHERE TABLE_TYPE != 'VIEW').
Phillip Copley,

3
"sysdiagrams" appare anche in questo elenco :(
celsowm

4
sysdiagrams è una tabella normale, devi sempre escluderla manualmente con a AND name <> 'sysdiagrams'.
Christoph,

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

Ecco un elenco di altri tipi di oggetti che puoi cercare anche:

  • AF: Funzione aggregata (CLR)
  • C: vincolo CHECK
  • D: vincolo predefinito o DEFAULT
  • F: vincolo ESTERO KEY
  • L: Log
  • FN: funzione scalare
  • Vendo: funzione scalare di assemblaggio (CLR)
  • FT: Funzione con valori di tabella Assembly (CLR)
  • IF: funzione tavolo allineata
  • IT: tabella interna
  • P: procedura memorizzata
  • PC: stored procedure di assemblaggio (CLR)
  • PK: vincolo PRIMARY KEY (il tipo è K)
  • RF: stored procedure del filtro di replica
  • S: tabella di sistema
  • SN: Sinonimo
  • SQ: coda di servizio
  • TA: trigger DML Assembly (CLR)
  • TF: funzione tabella
  • TR: trigger DML SQL
  • TT: tipo di tabella
  • U: tabella utente
  • UQ: vincolo UNIQUE (il tipo è K)
  • V: Visualizza
  • X: stored procedure estesa

9
L'aliasing è un po 'ridondante: SELECT name FROM sysobjects WHERE xtype = 'U'farebbe la stessa cosa.
PJSCopeland,

Grazie, inizialmente ho provato questo con più istruzioni select per PK,FK,D,C,V,UQetc per confrontare il database di origine e di destinazione, ma poi ho trovato questa funzione in VS, ma non c'è un sql queryconfronto tra il database di origine e di destinazione completo?
Shaijut,

Ci si chiede perché 'U'venga utilizzato per identificare la Tabella utenti ... al contrario di forse 'UT'o, il più intuitivo, 'T'... Ah bene, funziona!
user919426

87
SELECT * FROM INFORMATION_SCHEMA.TABLES 

O

SELECT * FROM Sys.Tables

5
Solo una nota che (come menzionato in altre risposte) sys.tables è disponibile solo dal 2005 in poi
Rob,

2
Il che non è un problema nel 2018. Penso che questo dovrebbe essere più alto :-)
Michal B.

29
USE YourDBName
GO 
SELECT *
FROM sys.Tables
GO

O

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; ancora supportato in SQL Server 2005.)



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

SELECT name FROM sysobjects WHERE xtype='U' AND name <> 'sysdiagrams'; perché la tabella dei sysdiagrams, sebbene creata da Microsoft SQL Server Management Studio, non è tecnicamente una tabella di sistema, ma di solito ci piacerebbe escludere comunque.
Christoph,

5

L'aspetto negativo di INFORMATION_SCHEMA.TABLESè che include anche tabelle di sistema come dtpropertiese le MSpeer_...tabelle, senza alcun modo di distinguerle dalle proprie tabelle.

Consiglio di utilizzare sys.objects(la nuova versione della vista sysobjects obsoleta ), che supporta l'esclusione delle tabelle di sistema:

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

2

In SSMS, per ottenere tutti i nomi di tabella completi in un database specifico (ad esempio, "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]

risultati:

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

2

Per favore usa questo. Otterrai i nomi delle tabelle insieme ai nomi degli schemi:

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

Grazie a Ray Vega, la cui risposta fornisce tutte le tabelle utente in un database ...

exec sp_msforeachtable 'print' '?' ''

sp_helptext mostra la query sottostante, che riassume in ...

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

Bene, puoi usare sys.objects per ottenere tutti gli oggetti del database.

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

O

--  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;

Questo link può fornire molte più informazioni su questo argomento


2
Questo non è per SQL Server, quindi non è una risposta a questa domanda.
Dan Getz,

0

L'uso SELECT * FROM INFORMATION_SCHEMA.COLUMNSmostra anche tutte le tabelle e le colonne correlate.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.