SQL Server y otras hierbas

Listar las tablas y columnas de una Base deDatos

Hoy me encontré con una petición bastante inusual (inusual, porque nunca me lo habían pedido antes…). ¿Como obtengo una lista de TODAS las tablas y TODAS las columnas de una Base de Datos?

No fue menor la solicitud. Obtener el listado de todas las columnas de una tabla no es difícil, pero esta Base de Datos tenia cerca de 60 tablas y algunas de estas tablas tienen casi 20 columnas, la tarea se hacía un poco tediosa.

Hasta que se me ocurrió ponerme a cachurear por ahí y encontré las siguientes consultas:

Para Bases de Datos SQL Server 2000

SELECT SO.NAME, SC.NAME

FROM sysobjects SO INNER JOIN syscolumns SC

ON SO.ID = SC.ID

WHERE SO.XTYPE = ‘U’

ORDER BY SO.NAME, SC.NAME

Para Bases de Datos SQL Server 2005

SELECT SO.NAME, SC.NAME

FROM sys.objects SO INNER JOIN sys.columns SC

ON SO.OBJECT_ID = SC.OBJECT_ID

WHERE SO.TYPE = ‘U’

ORDER BY SO.NAME, SC.NAME

 

Como siempre, sus dudas y comentarios son bienvenidos.

Posted: 11/1/2010 15:12 por Felipe Zuñiga | con 13 comment(s) |
Archivado en: ,
Comparte este post:

Comentarios

Arturo ha opinado:

Muchas gracias la versión 2005 funciona perfectamente en la versión 2008.

Saludos

# January 11, 2010 9:28 PM

arayo ha opinado:

Buen aporte Felipe, en SQL Server 2005 también puedes optar por utilizar la siguiente consulta para obtener las tablas de una base de datos

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.TABLES

si quieres obtener todas las columnas

SELECT COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS

y si quieres todas las columnas y tablas relacionadas puedes utilizar

SELECT TABLE_NAME, COLUMN_NAME FROM INFORMATION_SCHEMA.COLUMNS

Un saludo.

# January 11, 2010 9:43 PM

Arturo ha opinado:

Aporto una consulta para SQL Server 2008 que muestra:

- Tabla

- Columna

- Tipo de dato

- Tamaño del dato

SELECT

so.name AS Tabla,

sc.name AS Columna,

st.name AS Tipo,

sc.max_length AS Tamaño

FROM

sys.objects so INNER JOIN

sys.columns sc ON

so.object_id = sc.object_id INNER JOIN

sys.types st ON

st.system_type_id = sc.system_type_id AND

st.name != 'sysname'

WHERE

so.type = 'U'

ORDER BY

so.name,

sc.name

Saludos

# January 11, 2010 9:45 PM

Felipe Zuñiga ha opinado:

@Arturo y @arayo.

Ya probé las sentencias y funcionan perfecto.

Muchas gracias por sus aportes, asi da gusto escribir en un blog!

# January 11, 2010 10:04 PM

francisco ha opinado:

Probé todas las consultas para SQL 7 y me quedo con este SP que encontré hace tiempo....

Aqui les dejo el SP

----------------SP----------------------------------

if exists (select * from sysobjects where id = object_id('dbo.p_sizetables') and sysstat & 0xf = 4)

drop procedure dbo.p_sizetables

GO

create procedure dbo.p_sizetables

as

Begin transaction

/**************Procedimiento creado por KM para ver el tamaño de las tablas de una base de datos*/

SET NOCOUNT ON

declare @nombre_tabla varchar(100)

declare @propietario varchar(40)

declare @uid int

declare @nombre_completo varchar(150)

declare @nombre_db varchar(256)

create table #resultados

(nombre varchar(50),

filas decimal(12,0),

reservado varchar(40),

data varchar(40),

tamaño_indice varchar(20),

no_usado varchar(20))

declare tablas cursor

for select a.uid , propietario = left( b.name,40), tabla =  a.name from sysobjects a, sysusers b

where type = 'U' and a.uid = b.uid  order by tabla

select @nombre_db = db_name()

OPEN tablas

FETCH NEXT FROM tablas into @uid, @propietario, @nombre_tabla

WHILE @@FETCH_STATUS = 0

BEGIN

   if @uid = 1

   begin

         insert #resultados    

         exec sp_spaceused @nombre_tabla

   end

   else

       begin

        SET @nombre_completo = rtrim(ltrim(@nombre_db))+'.' + ltrim(rtrim(@propietario)) +'.'+ @nombre_tabla

         insert #resultados    

         exec sp_spaceused @nombre_completo

      end

   FETCH NEXT FROM tablas INTO @uid, @propietario, @nombre_tabla

END

CLOSE tablas

DEALLOCATE tablas

select * from #resultados

order by filas desc

Commit Transaction

# January 11, 2010 11:57 PM

Felipe Zuñiga ha opinado:

Gracias Francisco, desgraciadamente no tengo instancias SQL Server 7 para probar el SP.

# January 12, 2010 1:19 AM

gbr ha opinado:

Muy buen dato Felipe, también Arturo y Arayo.

Ahora, una pequeña consulta de un neófito: Hay alguna herramienta que me permita "documentar" una base de datos de forma "automatizada"?

Saludos

Gonzalo

# January 12, 2010 1:39 AM

Javier Torrecilla ha opinado:

Gran articulo Felipe!

@gbr: depende un poco de lo que quieras hacer, pero hay herramientas como Erwin que te permitirian hacer ingineria inversa y generar la documentación.

Tambien podrias utilizar las consultas que te dicen y hacer una select for xml....www.devjoker.com/.../Select-FOR-XML.aspxy luego transformarla con un xsl...

# January 12, 2010 9:05 AM

Felipe Zuñiga ha opinado:

@Francisco: Ya probé tu SP y funciona perfecto. Gracias!!!

@GBR: Prueba con la consulta que aportó Arturo en Report Builder 2.0, si ademas necesitas el modelo de datos, puedes hacerlo con Visio (yo usé 2010 Beta) y ahi vas generando la documentación.

# January 12, 2010 2:23 PM

Freddy Villamil ha opinado:

He probado las consultas con el SQL MOvil en Ipaq y funcionan perfecto. Gracias!!

# September 21, 2010 4:42 PM

Jeimar Arias ha opinado:

Excelente sentencia.

# March 18, 2011 11:39 PM

rosmeurys ha opinado:

muchas gracias me sirvio de mucho

# April 28, 2011 5:52 PM

Hiram ha opinado:

Muchas gracias probe todas las consultas y funcionan perfectamente..

# August 17, 2011 12:21 AM