Qual è il modo migliore per ottenere i nomi di tutte le tabelle in un database specifico su SQL Server?
SHOW TABLES
(come usato in MySQL) lavoro?
Qual è il modo migliore per ottenere i nomi di tutte le tabelle in un database specifico su SQL Server?
SHOW TABLES
(come usato in MySQL) lavoro?
Risposte:
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'
WHERE TABLE_TYPE='BASE TABLE'
includerà solo le tabelle di base (e per estensione è sempre possibile utilizzare WHERE TABLE_TYPE != 'VIEW'
).
AND name <> 'sysdiagrams'
.
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'
Ecco un elenco di altri tipi di oggetti che puoi cercare anche:
SELECT name FROM sysobjects WHERE xtype = 'U'
farebbe la stessa cosa.
'U'
venga utilizzato per identificare la Tabella utenti ... al contrario di forse 'UT'
o, il più intuitivo, 'T'
... Ah bene, funziona!
USE YourDBName
GO
SELECT *
FROM sys.Tables
GO
O
USE YourDBName
GO
SELECT * FROM INFORMATION_SCHEMA.TABLES
GO
SELECT * FROM information_schema.tables
where TABLE_TYPE = 'BASE TABLE'
SQL Server 2012
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.
L'aspetto negativo di INFORMATION_SCHEMA.TABLES
è che include anche tabelle di sistema come dtproperties
e 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
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:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
ORDER BY TABLE_NAME
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
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
L'uso SELECT * FROM INFORMATION_SCHEMA.COLUMNS
mostra anche tutte le tabelle e le colonne correlate.