List all DBs, Tables, and Columns
Sometimes it’s necessary or nice to export all the databases and tables on a server. This simple script will give you information about every table you have access. As a DBA, you can uncomment the “execute as…” and “revert” lines to determine what tables another user can see.
-- execute as login = 'newUser'
set nocount on
Declare @Output as table (DBName varchar(200), TableName varchar(200), TAB_VIEW varchar(10), ColName varchar(200), ColType varchar(200), PK bit)
declare @DBName as VARCHAR(100) = 'master'
declare @SQL as NVARCHAR(max)
declare @CurDB as int = 5
 
while @CurDB <= (select MAX(database_id) from master.sys.databases)
begin
SELECT @DBName = name from master.sys.databases where database_id = @CurDB
begin try
print 'Checking ' + @DBName + '…'
SET @SQL = 'select "' + @DBName + "' as DBName, tables.name as TableName, tables.TAB_VIEW, columns.name as ColName,
case types.name
when "varchar" then "varchar(" + ISNULL(NULLIF(NULLIF(convert(varchar(4),columns.max_length) ,-1),0),"MAX") + ")"
when "char" then "char(" + ISNULL(NULLIF(NULLIF(convert(varchar(4),columns.max_length) ,-1),0),"MAX") + ")"
when "nvarchar" then "nvarchar(" + ISNULL(NULLIF(NULLIF(convert(varchar(4),columns.max_length/2),-1),0),"MAX") + ")"
when "nchar" then "nchar(" + ISNULL(NULLIF(NULLIF(convert(varchar(4),columns.max_length/2),-1),0),"MAX") + ")"
when "binary" then "binary(" + ISNULL(NULLIF(NULLIF(convert(varchar(4),columns.max_length) ,-1),0),"MAX") + ")"
when "varbinary" then "varbinary(" + ISNULL(NULLIF(NULLIF(convert(varchar(4),columns.max_length) ,-1),0),"MAX") + ")"
when "numeric" then "numeric(" + convert(varchar(4),columns.precision) + "," + convert(varchar(4),columns.scale) + ")"
when "decimal" then "decimal(" + convert(varchar(4),columns.precision) + "," + convert(varchar(4),columns.scale) + ")"
when "float" then "float" + ISNULL(NULLIF("("+convert(varchar(4),columns.precision)+")","(53)"),"")
–when "varbinary" then "varbinary(" + ISNULL(NULLIF(NULLIF(convert(varchar(4),columns.max_length) ,-1),0),"MAX") + ")"
else types.name end as ColType–, columns.*
,isnull(PK.[PrimaryKey],0) as [PrimaryKey]
from [' + @DBName + '].sys.columns
inner join (SELECT NAME, object_id, is_ms_shipped, "TABLE" AS TAB_VIEW FROM [' + @DBName + '].sys.tables
union SELECT NAME, object_id, is_ms_shipped, "VIEW" AS TAB_VIEW FROM [' + @DBName + '].sys.views ) as tables
on tables.object_id = columns.object_id
left join [' + @DBName + '].sys.types
on types.user_type_id = columns.user_type_id
outer apply (
select case when si.object_id is not null then 1 else 0 end as [PrimaryKey]
from [' + @DBName + '].sys.indexes si
inner join [' + @DBName + '].sys.index_columns ic
ON si.OBJECT_ID = ic.OBJECT_ID
AND si.index_id = ic.index_id
and si.is_primary_key = 1
where si.object_id = tables.object_id
and ic.column_id = columns.column_id
) as PK
where tables.is_ms_shipped = 0'
insert @Output
exec sp_sqlexec @SQL
print '... Success'
end try
begin catch
print '... Error: ' + error_message()
end catch
set @CurDB += 1
end
select * from @Output
print 'COMPLETE!'
-- revert