Получение списка таблиц и полей в каждой в базе данных


85

Я смотрю на создание базового ORM (просто для развлечения), и мне было интересно, есть ли способ вернуть список таблиц в базе данных, а также поля для каждой таблицы?

Используя это, я хочу иметь возможность пройти через набор результатов (в C #), а затем сказать для каждой таблицы в наборе результатов сделать это (например, использовать отражение, чтобы создать класс, который будет выполнять или содержать xyz).

В дополнение к этому, какие хорошие онлайн-блоги для SQL Server? Я знаю, что этот вопрос действительно касается использования системных SP и баз данных в Sql Server, и я согласен с общими запросами, поэтому меня интересуют некоторые блоги, которые охватывают такого рода функции.

благодаря


Re; Список блогов SQL Server - взгляните на эту запись в моем блоге: dbalink.wordpress.com/2009/01/07/…
MarlonRibunal,

См. Соответствующий вопрос о дублировании: stackoverflow.com/questions/175415/…
Ray

1
Благодарю. Задачу можно выполнять с помощью C #.
GurdeepS

Ответы:


173

Это то, что вы ищите:

Использование ПРОСМОТРОВ КАТАЛОГА ОБЪЕКТОВ

 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/


7
Первый запрос всегда возвращает maxlength = 8000 для char, что неверно. Второй вопрос правильный и более подробный
smirkingman

1
оба запроса возвращают разное количество строк: /
GorvGoyl

Одно из преимуществ этого INFORMATION_SCHEMAподхода заключается в том, что он легко переносится между разными базами данных.
j_random_hacker 03

Это опечатка? Я бы использовал C.max_length AS Size ,- иначе вы получите maxlength = 8000, как упоминал @smirkingman.
mbx

Я считаю, что 1-й запрос не перечисляет схемы, а также возвращает слишком много строк (дубликатов), а 2-й запрос возвращает правильное количество строк. Итак, второй запрос - это тот, который нужно использовать.
Гэри Барретт

36

Таблицы ::

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'

8
В INFORMATION_SCHEMA замечательно то, что это ISO-образ, а не просто sql-сервер. Один и тот же код будет работать для всех совместимых баз данных
cindi,

Это очень полезно ... но как включить имя базы данных в выражение выше? Заранее спасибо ..
Амит Верма

@AmitVerma USE <your DB name>; SELECT * FROM INFORMATION_SCHEMA.COLUMNS (по крайней мере, синтаксис MS SQL)
Крис О.

12

Получить список всех таблиц и полей в базе данных:

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подхода заключается в том, что он легко переносится между разными базами данных.
j_random_hacker 03


7

Я протестировал несколько решений и обнаружил, что

Select *
From INFORMATION_SCHEMA.COLUMNS

дает вам информацию о столбце для вашей базы данных CURRENT / по умолчанию.

Select *
From <DBNAME>.INFORMATION_SCHEMA.COLUMNS

без <и> дает вам информацию о столбце для базы данных DBNAME.


3

Другой ваш встроенный друг - системный sproc SP_HELP.

пример использования:

sp_help <MyTableName>

Он возвращает гораздо больше информации, чем вам действительно нужно, но по крайней мере 90% ваших возможных требований будут удовлетворены.


1

Просто выбросьте это - теперь легко скопировать / вставить в слово или документ 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>'

0

Это даст вам все таблицы, созданные пользователем:

select * from sysobjects where xtype='U'

Чтобы получить cols:

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

Кроме того, я считаю http://www.sqlservercentral.com/ довольно хорошим ресурсом по базам данных.


0

Это вернет имя базы данных, имя таблицы, имя столбца и тип данных столбца, указанный параметром базы данных:

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

Для всех представлений это список имени таблицы, имени столбца, типа данных и длины каждого столбца, возвращаемого представлением. Это не отвечает на вопрос, но это аккуратный запрос.
Бен

0

Я нашел простой способ получить подробную информацию о таблицах и столбцах конкретной БД с помощью разработчика SQL.

Select *FROM USER_TAB_COLUMNS

0

SELECT * FROM INFORMATION_SCHEMA.COLUMNS забыть все

SELECT TABLE_NAME FROM INFORMATION_SCHEMA.COLUMNSдля получения имени всей таблицы. Попробуйте на sqlserver,


0

Для MYSQL:

Select *
From INFORMATION_SCHEMA.COLUMNS
where TABLE_SCHEMA = "<DatabaseName>"

TABLE_SCHEMAэто не имя базы данных, это имя схемы (т.е. dbo). TABLE_CATALOGэто имя базы данных.
DDuffy,

TABLE_SCHEMA: имя схемы (базы данных), к которой принадлежит таблица. TABLE_CATALOG: имя каталога, которому принадлежит таблица.
Джотиранджан

в mysql. не mssql. Не поймите меня неправильно, я не говорю, что ваш ответ был неправильным. Это правильно, только не для mssql. Я считаю, что они по-разному относятся к схеме в обоих.
DDuffy

-1

в 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

это показывает вам все таблицы и столбцы (и их определения) из всех пользовательских баз данных.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.