Sqlserver
 sql >> Database >  >> RDS >> Sqlserver

Come faccio a elencare tutte le tabelle in tutti i database in SQL Server in un unico set di risultati?

per un modo semplice per ottenere tutte le tabelle sul server, prova questo:

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

restituirà una singola colonna che contiene il server+database+schema+nome tabella:output campione:

CompleteTableName
--------------------------------------------
YourServer.YourDatabase1.YourSchema1.YourTable1
YourServer.YourDatabase1.YourSchema1.YourTable2
YourServer.YourDatabase1.YourSchema2.YourTable1
YourServer.YourDatabase1.YourSchema2.YourTable2
YourServer.YourDatabase2.YourSchema1.YourTable1

se non utilizzi SQL Server 2005 o versioni successive, sostituisci la tabella DECLARE @AllTables table con CREATE TABLE #AllTables e poi ogni @AllTables con #AllTables e funzionerà.

MODIFICA
ecco una versione che consentirà di utilizzare un parametro di ricerca su qualsiasi parte o parti dei nomi server+database+schema+tabella:

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

imposta @Search su NULL per tutte le tabelle, impostalo su cose come 'dbo.users' o 'users' o '.master.dbo' o includi anche caratteri jolly come '.master.%.u', ecc.