Я смотрю на создание базового ORM (просто для развлечения), и мне было интересно, есть ли способ вернуть список таблиц в базе данных, а также поля для каждой таблицы?
Используя это, я хочу иметь возможность пройти через набор результатов (в C #), а затем сказать для каждой таблицы в наборе результатов сделать это (например, использовать отражение, чтобы создать класс, который будет выполнять или содержать xyz).
В дополнение к этому, какие хорошие онлайн-блоги для SQL Server? Я знаю, что этот вопрос действительно касается использования системных SP и баз данных в Sql Server, и я согласен с общими запросами, поэтому меня интересуют некоторые блоги, которые охватывают такого рода функции.
благодаря
Ответы:
Это то, что вы ищите:
Использование ПРОСМОТРОВ КАТАЛОГА ОБЪЕКТОВ
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';
Использование ИНФОРМАЦИОННОЙ СХЕМЫ ПРОСМОТРОВ
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;
Ссылка: Мой блог - http://dbalink.wordpress.com/2008/10/24/querying-the-object-catalog-and-information-schema-views/
источник
INFORMATION_SCHEMA
подхода заключается в том, что он легко переносится между разными базами данных.C.max_length AS Size ,
- иначе вы получите maxlength = 8000, как упоминал @smirkingman.Таблицы ::
SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_TYPE='BASE TABLE'
столбцы ::
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
или же
SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_NAME='your_table_name'
источник
USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS
(по крайней мере, синтаксис MS SQL)Получить список всех таблиц и полей в базе данных:
Select * From INFORMATION_SCHEMA.COLUMNS Where TABLE_CATALOG Like 'DatabaseName'
Получить список всех полей в таблице:
Select * From INFORMATION_SCHEMA.COLUMNS Where TABLE_CATALOG Like 'DatabaseName' And TABLE_NAME Like 'TableName'
источник
INFORMATION_SCHEMA
подхода заключается в том, что он легко переносится между разными базами данных.SELECT * FROM INFORMATION_SCHEMA.COLUMNS
источник
Я протестировал несколько решений и обнаружил, что
Select * From INFORMATION_SCHEMA.COLUMNS
дает вам информацию о столбце для вашей базы данных CURRENT / по умолчанию.
Select * From <DBNAME>.INFORMATION_SCHEMA.COLUMNS
без <и> дает вам информацию о столбце для базы данных DBNAME.
источник
Другой ваш встроенный друг - системный sproc SP_HELP.
пример использования:
Он возвращает гораздо больше информации, чем вам действительно нужно, но по крайней мере 90% ваших возможных требований будут удовлетворены.
источник
Просто выбросьте это - теперь легко скопировать / вставить в слово или документ 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>'
источник
Это даст вам все таблицы, созданные пользователем:
select * from sysobjects where xtype='U'
Чтобы получить cols:
Select * from Information_Schema.Columns Where Table_Name = 'Insert Table Name Here'
Кроме того, я считаю http://www.sqlservercentral.com/ довольно хорошим ресурсом по базам данных.
источник
Это вернет имя базы данных, имя таблицы, имя столбца и тип данных столбца, указанный параметром базы данных:
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
источник
Я нашел простой способ получить подробную информацию о таблицах и столбцах конкретной БД с помощью разработчика SQL.
Select *FROM USER_TAB_COLUMNS
источник
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
забыть всеSELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNS
для получения имени всей таблицы. Попробуйте на sqlserver,источник
Для MYSQL:
Select * From INFORMATION_SCHEMA.COLUMNS where TABLE_SCHEMA = "<DatabaseName>"
источник
TABLE_SCHEMA
это не имя базы данных, это имя схемы (т.е.dbo
).TABLE_CATALOG
это имя базы данных.в Microsoft SQL Server вы можете использовать это:
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
это показывает вам все таблицы и столбцы (и их определения) из всех пользовательских баз данных.
источник