sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo enumero todas las tablas en todas las bases de datos en SQL Server en un único conjunto de resultados?

para obtener una forma sencilla de obtener todas las tablas en el servidor, intente esto:

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

devolverá una única columna que contiene el servidor+base de datos+esquema+nombre de la tabla:salida de muestra:

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

si no está en SQL Server 2005 o superior, reemplace la tabla DECLARE @AllTables table con CREATE TABLE #AllTables y luego cada @AllTables con #AllTables y funcionará.

EDITAR
aquí hay una versión que permitirá que se use un parámetro de búsqueda en cualquier parte o partes del servidor+base de datos+esquema+nombres de tabla:

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

establezca @Search en NULL para todas las tablas, establezca cosas como 'dbo.users' o 'users' o '.master.dbo' o incluso incluya comodines como '.master.%u', etc.