Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como listo todas as tabelas em todos os bancos de dados do SQL Server em um único conjunto de resultados?


para uma maneira simples de obter todas as tabelas no servidor, tente isto:
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

ele retornará uma única coluna que contém o server+database+schema+table name:sample output:
CompleteTableName
--------------------------------------------
YourServer.YourDatabase1.YourSchema1.YourTable1
YourServer.YourDatabase1.YourSchema1.YourTable2
YourServer.YourDatabase1.YourSchema2.YourTable1
YourServer.YourDatabase1.YourSchema2.YourTable2
YourServer.YourDatabase2.YourSchema1.YourTable1

se você não estiver no SQL Server 2005 ou superior, substitua a tabela DECLARE @AllTables table com CREATE TABLE #AllTables e, em seguida, cada @AllTables com #AllTables e vai funcionar.

EDITAR
aqui está uma versão que permitirá que um parâmetro de pesquisa seja usado em qualquer parte ou partes do servidor+banco de dados+esquema+nomes de tabela:
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

defina @Search como NULL para todas as tabelas, defina-o para coisas como 'dbo.users' ou 'users' ou '.master.dbo' ou até inclua curingas como '.master.%u', etc.