Obtener una lista de tablas y campos de cada uno en una base de datos

84

Estoy buscando crear un ORM básico (puramente por diversión) y me preguntaba, ¿hay alguna manera de devolver la lista de tablas en una base de datos y también los campos para cada tabla?

Usando esto, quiero poder recorrer el conjunto de resultados (en C #) y luego decir para cada tabla en el conjunto de resultados, haga esto (por ejemplo, use la reflexión para hacer una clase que haga o contenga xyz).

Además de esto, ¿cuáles son algunos buenos blogs en línea para SQL Server? Sé que esta pregunta realmente trata sobre el uso de SP del sistema y bases de datos en Sql Server, y estoy de acuerdo con las consultas generales, por lo que estoy interesado en algunos blogs que cubren este tipo de funcionalidad.

Gracias

GurdeepS
fuente
Re; Lista de blogs de SQL Server: eche un vistazo a esta entrada en mi blog: dbalink.wordpress.com/2009/01/07/…
MarlonR Court
Consulte la pregunta dup relacionada: stackoverflow.com/questions/175415/…
Ray
1
Gracias. La tarea se puede realizar con C #.
GurdeepS

Respuestas:

172

Es esto lo que estás buscando:

Uso de VISTAS DE CATÁLOGO DE OBJETOS

 SELECT T.name AS Table_Name ,
       C.name AS Column_Name ,
       P.name AS Data_Type ,
       P.max_length AS Size ,
       CAST(P.precision AS VARCHAR) + '/' + CAST(P.scale AS VARCHAR) AS Precision_Scale
FROM   sys.objects AS T
       JOIN sys.columns AS C ON T.object_id = C.object_id
       JOIN sys.types AS P ON C.system_type_id = P.system_type_id
WHERE  T.type_desc = 'USER_TABLE';

Uso de VISTAS DE ESQUEMA DE INFORMACIÓN

  SELECT TABLE_SCHEMA ,
       TABLE_NAME ,
       COLUMN_NAME ,
       ORDINAL_POSITION ,
       COLUMN_DEFAULT ,
       DATA_TYPE ,
       CHARACTER_MAXIMUM_LENGTH ,
       NUMERIC_PRECISION ,
       NUMERIC_PRECISION_RADIX ,
       NUMERIC_SCALE ,
       DATETIME_PRECISION
FROM   INFORMATION_SCHEMA.COLUMNS;

Referencia: Mi blog - http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/

Marlon Tribunal
fuente
7
La primera consulta siempre devuelve maxlength = 8000 para char, lo cual es incorrecto. La segunda consulta es correcta y más detallada
smirkingman
1
ambas consultas devuelven un número diferente de filas: /
GorvGoyl
Una ventaja del INFORMATION_SCHEMAenfoque es que es bastante portátil entre diferentes bases de datos.
j_random_hacker
¿Eso es un error tipográfico? Yo usaría C.max_length AS Size ,; de lo contrario, terminaría con maxlength = 8000 tal como mencionó @smirkingman.
mbx
Encuentro que la primera consulta no enumera esquemas y también devuelve demasiadas filas (duplicados) y la segunda consulta devuelve el número correcto de filas. Entonces, la segunda consulta es la que se debe usar.
Gary Barrett
36

Mesas ::

SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'

columnas ::

SELECT * FROM INFORMATION_SCHEMA.COLUMNS 

o

SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='your_table_name'
ZombieOvejas
fuente
8
Lo bueno de INFORMATION_SCHEMA es que es una cosa ISO, no solo una cosa de servidor SQL. El mismo código funcionará para todas las bases de datos compatibles
cindi
Eso es muy útil ... pero ¿cómo incluir el nombre de la base de datos en la expresión anterior? Gracias de antemano ..
Amit Verma
@AmitVerma USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS (sintaxis MS SQL al menos)
Chris O
12

Obtenga una lista de todas las tablas y los campos en la base de datos:

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName'

Obtenga una lista de todos los campos en la tabla:

Select *
From INFORMATION_SCHEMA.COLUMNS
Where TABLE_CATALOG Like 'DatabaseName' And TABLE_NAME Like 'TableName' 
ShelS
fuente
Una ventaja del INFORMATION_SCHEMAenfoque es que es bastante portátil entre diferentes bases de datos.
j_random_hacker
7
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
JeremyDWill
fuente
7

Probé algunas soluciones y descubrí que

Select *
From INFORMATION_SCHEMA.COLUMNS

le da la información de la columna para su base de datos ACTUAL / predeterminada.

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

, sin <y>, le da la información de la columna para la base de datos DBNAME.

Jie
fuente
3

Su otro amigo incorporado aquí es el sistema sproc SP_HELP.

uso de muestra ::

sp_help <MyTableName>

Devuelve mucha más información de la que realmente necesita, pero se atenderá al menos el 90% de sus posibles requisitos.

ZombieOvejas
fuente
1

Simplemente lanzando esto, ahora es fácil copiar / pegar en una palabra o documento de Google:

PRINT '<html><body>'
SET NOCOUNT ON
DECLARE @tableName VARCHAR(30)
DECLARE tableCursor CURSOR LOCAL FAST_FORWARD FOR
    SELECT T.name AS TableName 
      FROM sys.objects AS T
     WHERE T.type_desc = 'USER_TABLE'
     ORDER BY T.name
OPEN tableCursor
FETCH NEXT FROM tableCursor INTO @tableName
WHILE @@FETCH_STATUS = 0 BEGIN
    PRINT '<h2>' + @tableName + '</h2>'
    PRINT '<pre>'
    SELECT LEFT(C.name, 30) AS ColumnName,
           LEFT(ISC.DATA_TYPE, 10) AS DataType,
           C.max_length AS Size,
           CAST(P.precision AS VARCHAR(4)) + '/' + CAST(P.scale AS VARCHAR(4)) AS PrecScale,
           CASE WHEN C.is_nullable = 1 THEN 'Null' ELSE 'No Null' END AS [Nullable],
           LEFT(ISNULL(ISC.COLUMN_DEFAULT, ' '), 5)  AS [Default],
           CASE WHEN C.is_identity = 1 THEN 'Identity' ELSE '' END AS [Identity]
    FROM   sys.objects AS T
           JOIN sys.columns AS C ON T.object_id = C.object_id
           JOIN sys.types AS P ON C.system_type_id = P.system_type_id
           JOIN INFORMATION_SCHEMA.COLUMNS AS ISC ON T.name = ISC.TABLE_NAME AND C.name = ISC.COLUMN_NAME
    WHERE  T.type_desc = 'USER_TABLE'
      AND  T.name = @tableName
    ORDER BY T.name, ISC.ORDINAL_POSITION
    PRINT '</pre>'
    FETCH NEXT FROM tableCursor INTO @tableName

END

CLOSE tableCursor
DEALLOCATE tableCursor
SET NOCOUNT OFF
PRINT '</body></html>'
Manni Marquesa
fuente
1

Para MYSQL:

Select *
From INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = "<DatabaseName>"
Jyotiranjan
fuente
TABLE_SCHEMAno es el nombre de la base de datos, es el nombre del esquema (es decir dbo). TABLE_CATALOGes el nombre de la base de datos.
DDuffy
TABLE_SCHEMA: El nombre del esquema (base de datos) al que pertenece la tabla. TABLE_CATALOG: El nombre del catálogo al que pertenece la tabla.
Jyotiranjan
en mysql. no mssql. No me malinterpretes, no estoy diciendo que tu respuesta sea incorrecta. Es correcto, pero no para mssql. Creo que tratan los esquemas de manera diferente en ambos.
DDuffy
0

Esto le dará todas las tablas creadas por el usuario:

select * from sysobjects where xtype='U'

Para conseguir los cols:

Select * from Information_Schema.Columns Where Table_Name = 'Insert Table Name Here'

Además, creo que http://www.sqlservercentral.com/ es un recurso de base de datos bastante bueno.

Brendan
fuente
0

Esto devolverá el nombre de la base de datos, el nombre de la tabla, el nombre de la columna y el tipo de datos de la columna especificada por un parámetro de la base de datos:

declare @database nvarchar(25)
set @database = ''

SELECT cu.table_catalog,cu.VIEW_SCHEMA, cu.VIEW_NAME, cu.TABLE_NAME,   
cu.COLUMN_NAME,c.DATA_TYPE,c.character_maximum_length
from INFORMATION_SCHEMA.VIEW_COLUMN_USAGE as cu
JOIN INFORMATION_SCHEMA.COLUMNS as c
on cu.TABLE_SCHEMA = c.TABLE_SCHEMA and c.TABLE_CATALOG = 
cu.TABLE_CATALOG
and c.TABLE_NAME = cu.TABLE_NAME
and c.COLUMN_NAME = cu.COLUMN_NAME
where cu.TABLE_CATALOG = @database
order by cu.view_name,c.COLUMN_NAME
Tony Gallone
fuente
Para todas las Vistas , esto muestra el nombre de la tabla, el nombre de la columna, el tipo de datos y la longitud de cada columna devuelta por la vista. Esto no responde a la pregunta, pero es una pregunta ordenada.
Ben
0

Encontré una manera fácil de obtener los detalles de las tablas y columnas de una base de datos en particular usando el desarrollador SQL.

Select *FROM USER_TAB_COLUMNS
Sampath Kumar S
fuente
0

SELECT * FROM INFORMATION_SCHEMA.COLUMNS olvidalo todo

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNSpara obtener todos los nombres de la tabla. Pruébelo en sqlserver,

nafaa jamel
fuente
-1

en un Microsoft SQL Server puede usar esto:

declare @sql2 nvarchar(2000)
        set @sql2  ='
use ?
if (  db_name(db_id()) not in (''master'',''tempdb'',''model'',''msdb'',''SSISDB'')  )
begin   

select
    db_name() as db,
    SS.name as schemaname,
    SO.name tablename,
    SC.name columnname,
    ST.name type,
    case when ST.name in (''nvarchar'', ''nchar'')
        then convert(varchar(10), ( SC.max_length / 2 ))
        when ST.name in (''char'', ''varchar'')
        then convert(varchar(10), SC.max_length)
        else null
    end as length,
    case when SC.is_nullable = 0 then ''No'' when SC.is_nullable = 1 then ''Yes'' else null end as nullable,
    isnull(SC.column_id,0) as col_number
from sys.objects                  SO
join sys.schemas                  SS
    on SS.schema_id = SO.schema_id
join sys.columns             SC
on SO.object_id     = SC.object_id
left join sys.types               ST
    on SC.user_type_id = ST.user_type_id and SC.system_type_id = ST.system_type_id
    where SO.is_ms_shipped = 0 
end
'

exec sp_msforeachdb @command1 = @sql2

esto le muestra todas las tablas y columnas (y su definición) de todas las bases de datos definidas por el usuario.

cjonas
fuente