Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Wie liste ich alle Tabellen in allen Datenbanken in SQL Server in einer einzigen Ergebnismenge auf?

Versuchen Sie Folgendes, um auf einfache Weise alle Tabellen auf dem Server abzurufen:

SET NOCOUNT ON
DECLARE @AllTables table (CompleteTableName nvarchar(4000))
INSERT INTO @AllTables (CompleteTableName)
    EXEC sp_msforeachdb 'select @@SERVERNAME+''.''+''?''+''.''+s.name+''.''+t.name from [?].sys.tables t inner join sys.schemas s on t.schema_id=s.schema_id'
SET NOCOUNT OFF
SELECT * FROM @AllTables ORDER BY 1

Es wird eine einzelne Spalte zurückgegeben, die den Server+Datenbank+Schema+Tabellenname:Beispielausgabe:

enthält
CompleteTableName
--------------------------------------------
YourServer.YourDatabase1.YourSchema1.YourTable1
YourServer.YourDatabase1.YourSchema1.YourTable2
YourServer.YourDatabase1.YourSchema2.YourTable1
YourServer.YourDatabase1.YourSchema2.YourTable2
YourServer.YourDatabase2.YourSchema1.YourTable1

Wenn Sie nicht auf SQL Server 2005 oder höher arbeiten, ersetzen Sie die DECLARE @AllTables table mit CREATE TABLE #AllTables und dann alle @AllTables mit #AllTables und es wird funktionieren.

BEARBEITEN
Hier ist eine Version, die die Verwendung eines Suchparameters für jeden Teil oder Teile der Server+Datenbank+Schema+Tabellennamen erlaubt:

SET NOCOUNT ON
DECLARE @AllTables table (CompleteTableName nvarchar(4000))
DECLARE @Search nvarchar(4000)
       ,@SQL   nvarchar(4000)
SET @Search=null --all rows
SET @SQL='select @@SERVERNAME+''.''+''?''+''.''+s.name+''.''+t.name from [?].sys.tables t inner join sys.schemas s on t.schema_id=s.schema_id WHERE @@SERVERNAME+''.''+''?''+''.''+s.name+''.''+t.name LIKE ''%'+ISNULL(@SEARCH,'')+'%'''

INSERT INTO @AllTables (CompleteTableName)
    EXEC sp_msforeachdb @SQL
SET NOCOUNT OFF
SELECT * FROM @AllTables ORDER BY 1

Setzen Sie @Search für alle Tabellen auf NULL, setzen Sie es auf Dinge wie 'dbo.users' oder 'users' oder '.master.dbo' oder fügen Sie sogar Platzhalter wie '.master.%.u' usw. hinzu.