Was ist der beste Weg, um die Namen aller Tabellen in einer bestimmten Datenbank unter SQL Server abzurufen?
SHOW TABLES
(wie in MySQL verwendet)?
Was ist der beste Weg, um die Namen aller Tabellen in einer bestimmten Datenbank unter SQL Server abzurufen?
SHOW TABLES
(wie in MySQL verwendet)?
Antworten:
SQL Server 2000, 2005, 2008, 2012, 2014, 2016, 2017 oder 2019:
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
Nur Tabellen aus einer bestimmten Datenbank anzeigen
SELECT TABLE_NAME
FROM <DATABASE_NAME>.INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
Oder,
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE = 'BASE TABLE'
AND TABLE_CATALOG='dbName' --(for MySql, use: TABLE_SCHEMA='dbName' )
PS: Für SQL Server 2000:
SELECT * FROM sysobjects WHERE xtype='U'
WHERE TABLE_TYPE='BASE TABLE'
umfasst nur Basistabellen (und als Erweiterung können Sie diese immer verwenden WHERE TABLE_TYPE != 'VIEW'
).
AND name <> 'sysdiagrams'
.
SELECT sobjects.name
FROM sysobjects sobjects
WHERE sobjects.xtype = 'U'
Hier ist eine Liste anderer Objekttypen, nach denen Sie ebenfalls suchen können:
SELECT name FROM sysobjects WHERE xtype = 'U'
würde das gleiche tun.
'U'
die Benutzertabelle verwendet wird ... im Gegensatz zu vielleicht 'UT'
oder, am intuitivsten, 'T'
... Ah, das funktioniert!
USE YourDBName
GO
SELECT *
FROM sys.Tables
GO
ODER
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';
da die von Microsoft SQL Server Management Studio erstellte Sysdiagrams-Tabelle technisch gesehen keine Systemtabelle ist, sondern eine, die wir normalerweise trotzdem ausschließen möchten.
Der Nachteil von INFORMATION_SCHEMA.TABLES
ist, dass es auch Systemtabellen wie dtproperties
und die MSpeer_...
Tabellen enthält, ohne dass Sie sie von Ihren eigenen Tabellen unterscheiden können.
Ich würde empfehlen, sys.objects
(die neue Version der veralteten Sysobjects- Ansicht) zu verwenden, die das Ausschließen der Systemtabellen unterstützt:
select *
from sys.objects
where type = 'U' -- User tables
and is_ms_shipped = 0 -- Exclude system tables
So rufen Sie in SSMS alle vollständig qualifizierten Tabellennamen in einer bestimmten Datenbank ab (z. B. "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]
Ergebnisse:
SELECT TABLE_NAME
FROM INFORMATION_SCHEMA.TABLES
WHERE TABLE_TYPE='BASE TABLE'
ORDER BY TABLE_NAME
Vielen Dank an Ray Vega, dessen Antwort alle Benutzertabellen in einer Datenbank enthält ...
exec sp_msforeachtable 'print' '?' ''
sp_helptext zeigt die zugrunde liegende Abfrage, die zu ...
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
Nun, Sie können sys.objects verwenden , um alle Datenbankobjekte abzurufen .
GO
select * from sys.objects where type_desc='USER_TABLE' order by name
GO
ODER
-- 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
--for oracle
select tablespace_name, table_name from all_tables;
Dieser Link kann viel mehr Informationen zu diesem Thema enthalten
Die Verwendung SELECT * FROM INFORMATION_SCHEMA.COLUMNS
zeigt Ihnen auch alle Tabellen und zugehörigen Spalten.