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
Respuestas:
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/
fuente
INFORMATION_SCHEMA
enfoque es que es bastante portátil entre diferentes bases de datos.C.max_length AS Size ,
; de lo contrario, terminaría con maxlength = 8000 tal como mencionó @smirkingman.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'
fuente
USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS
(sintaxis MS SQL al menos)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'
fuente
INFORMATION_SCHEMA
enfoque es que es bastante portátil entre diferentes bases de datos.SELECT * FROM INFORMATION_SCHEMA.COLUMNS
fuente
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.
fuente
Su otro amigo incorporado aquí es el sistema sproc SP_HELP.
uso de muestra ::
Devuelve mucha más información de la que realmente necesita, pero se atenderá al menos el 90% de sus posibles requisitos.
fuente
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>'
fuente
Para MYSQL:
Select * From INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA = "<DatabaseName>"
fuente
TABLE_SCHEMA
no es el nombre de la base de datos, es el nombre del esquema (es decirdbo
).TABLE_CATALOG
es el nombre de la base de datos.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.
fuente
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
fuente
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
fuente
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
olvidalo todoSELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS
para obtener todos los nombres de la tabla. Pruébelo en sqlserver,fuente
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.
fuente