Оператор SQL для получения типа столбца


302

Есть ли оператор SQL, который может вернуть тип столбца в таблице?


5
Зависит от РСУБД; SQL Server имеет sys.syscolumnsтаблицу, например.
LittleBobbyTables - Au Revoir

3
Да, но это будет отличаться в зависимости от того, какой тип СУБД вы используете - SQL - это язык, а не продукт базы данных, и этот вопрос зависит от конкретного продукта. Вы сможете найти такую ​​информацию в INFORMATION_SCHEMA.COLUMNSтаблице - если она есть в вашей СУБД.
Мост

Ответы:


461

Использование SQL Server:

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'yourTableName' AND 
     COLUMN_NAME = 'yourColumnName'

11
Только если вы не хотите видеть имя соответствующего столбца. Это вернет только типы. Если вы хотите увидеть имя столбца, к
которому

5
И если ваша таблица не входит в схему по умолчанию, вы можете расширить условие с помощьюAND TABLE_SCHEMA = 'yourSchema'
luviktor

8
это здорово - но возможно ли, чтобы он возвращал диапазон для типа столбца? т.е. varchar(255)вместо varcharи int(11)вместо int?
Дон Чидл

13
@mmcrae: это возможно, используя столбец CHARACTER_MAXIMUM_LENGTHв INFORMATION_SCHEMA.COLUMNS. Просто сделайте, SELECT * FROM INFORMATION_SCHEMA.COLUMNSчтобы увидеть все доступные столбцы.
Фрэнсис П

2
Как насчет временных таблиц?
Илья Газман

77

Самый простой способ в TSQL:

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'yourTableName'

44

Для SQL Server эта системная хранимая процедура будет возвращать всю информацию таблицы, включая типы данных столбцов:

exec sp_help YOURTABLENAME

5
Я проголосовал, поскольку это хотя и не совсем ответ, но предоставляет мне ценную информацию. Например, информация «IsComputed», которую я не нашел в информационной схеме, но могу найти в коде процедуры sp_help и скопировать оттуда.
Кристоф

2
выберите имя таблицы и нажмите Alt+F1.. дает тот же результат.
Пугал

для уточнения: имя таблицы или представления необходимо выбрать в редакторе, а затем нажать Alt+F1. Не в решении Object Explorer. Это такая полезная функция
Bugybunny

18

В TSQL / MSSQL это выглядит так:

SELECT t.name, c.name 
FROM sys.tables t 
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types y ON y.user_type_id = c.user_type_id
WHERE t.name = ''

2
На самом деле это JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id не уникален. sys.columns doc
Fabricio

12

в Oracle SQL вы бы сделали это:

SELECT
    DATA_TYPE
FROM
    all_tab_columns 
WHERE
    table_name = 'TABLE NAME' -- in uppercase
AND column_name = 'COLUMN NAME' -- in uppercase

9

Если вы используете MySQL, вы можете попробовать

SHOW COLUMNS FROM `tbl_name`;

ПОКАЗАТЬ КОЛОННЫ на dev.mysql.com

В противном случае вы должны быть в состоянии сделать

DESCRIBE `tbl_name`;

1
В противном случае вы имеете в виду другие СУБД, кроме MySQL?
Ламак

2
Да. DESCRIBEСинтаксис действует в Oracle , а также, однако MsSQL не будет принимать этот синтаксис.
Фестивали

Смотрите ответ от @jTC для метода на MSSQL и TSQL.
Фестивали

Более новые версии MySQL имеют information_schema.COLUMNS.
Рик Джеймс

Я считаю, что DESC OR DESCRIBE (в зависимости от используемой вами СУБД) полезен для небольших таблиц с 3 или 4 столбцами, тогда он показывает структуру таблицы с именем столбца Nullable flag и тип столбца для больших таблиц, однако для возврата результата требуется больше времени, и Труднее найти нужную вам информацию.
скорость

7

Еще один вариант с использованием MS SQL:

SELECT TYPE_NAME(system_type_id) 
FROM sys.columns 
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');

4

Использование TSQL / MSSQL

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

SELECT TABLE_NAME,COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'your_table_name'

Единственное, что нужно изменить, это ваше_имя_таблицы.


4

Чтобы опираться на приведенные выше ответы, часто бывает полезно получить тип данных столбца в том же формате, в котором вам нужно объявить столбцы.

Так , например, varchar(50), varchar(max), decimal(p, s).

Это позволяет вам сделать это:

SELECT 
  [Name]         = c.[name]
, [Type]         = 
    CASE 
      WHEN tp.[name] IN ('varchar', 'char') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length AS VARCHAR(25))) + ')' 
      WHEN tp.[name] IN ('nvarchar','nchar') THEN tp.[name] + '(' + IIF(c.max_length = -1, 'max', CAST(c.max_length / 2 AS VARCHAR(25)))+ ')'      
      WHEN tp.[name] IN ('decimal', 'numeric') THEN tp.[name] + '(' + CAST(c.[precision] AS VARCHAR(25)) + ', ' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      WHEN tp.[name] IN ('datetime2') THEN tp.[name] + '(' + CAST(c.[scale] AS VARCHAR(25)) + ')'
      ELSE tp.[name]
    END
, [RawType]      = tp.[name]
, [MaxLength]    = c.max_length
, [Precision]    = c.[precision]
, [Scale]        = c.scale
FROM sys.tables t 
JOIN sys.schemas s ON t.schema_id = s.schema_id
JOIN sys.columns c ON t.object_id = c.object_id
JOIN sys.types tp ON c.user_type_id = tp.user_type_id
WHERE s.[name] = 'dbo' AND t.[name] = 'MyTable'

1
Это должен был быть принятый ответ. Спасибо, может быть, вы можете добавить условие (t.type = 'U') - удалить системную таблицу
Янник

И VARBINARY типы могут быть легко обслужены, добавив это в первую WHENстроку:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Обратный инженер

3
USE [YourDatabaseName]
GO

SELECT column_name 'Column Name',
data_type 'Data Type'
FROM information_schema.columns
WHERE table_name = 'YourTableName'
GO

Это вернет значения Имя столбца, показывая вам имена столбцов и типы данных этих столбцов (целые числа, varchars и т. Д.).


3

Для IBM DB2 :

SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'

2

Чтобы извлечь фактически объявленные типы данных, например, для использования в динамическом SQL, в ALTER COLUMN, можно использовать что-то вроде этого:

SELECT
    TABLE_NAME, 
    COLUMN_NAME,
    DATA_TYPE
        + CASE WHEN DATA_TYPE IN ('char','nchar','varchar','nvarchar','binary','varbinary')
                    AND CHARACTER_MAXIMUM_LENGTH > 0 THEN
                 COALESCE('('+CONVERT(varchar,CHARACTER_MAXIMUM_LENGTH)+')','')
            ELSE '' END
        + CASE WHEN DATA_TYPE IN ('decimal','numeric') THEN
                COALESCE('('+CONVERT(varchar,NUMERIC_PRECISION)+','+CONVERT(varchar,NUMERIC_SCALE)+')','')
            ELSE '' END
        AS Declaration_Type,
    CASE WHEN IS_NULLABLE='NO' THEN 'NOT ' ELSE '' END + 'NULL' AS Nullable
FROM INFORMATION_SCHEMA.COLUMNS
ORDER BY 1,2

1

В моем случае мне нужно было получить тип данных для динамического SQL (Shudder!). В любом случае, я создал функцию, которая возвращает полный тип данных. Например, вместо того, чтобы возвращать 'десятичное', оно вернет DECIMAL (18,4): dbo.GetLiteralDataType


1

Использование TSQL / MSSQL

Вы можете использовать INTOключевое слово.

Результат SELECTв настоящий СТОЛ

Пример: select .... INTO real_table_name

После

sp_help real_table_name

1

Используйте этот запрос, чтобы получить схему, таблицу, столбец, тип, max_length, is_nullable

SELECT QUOTENAME(SCHEMA_NAME(tb.[schema_id])) AS 'Schema'
    ,QUOTENAME(OBJECT_NAME(tb.[OBJECT_ID])) AS 'Table'
    ,C.NAME as 'Column'
    ,T.name AS 'Type'
    ,C.max_length
    ,C.is_nullable
FROM SYS.COLUMNS C INNER JOIN SYS.TABLES tb ON tb.[object_id] = C.[object_id]
    INNER JOIN SYS.TYPES T ON C.system_type_id = T.user_type_id
WHERE tb.[is_ms_shipped] = 0
ORDER BY tb.[Name]




0

В vb60 вы можете сделать это:

Public Cn As ADODB.Connection
'open connection
Dim Rs As ADODB.Recordset
 Set Rs = Cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, UCase("Table"), UCase("field")))

'и пример (valRs - моя функция для поля rs.fields ("CHARACTER_MAXIMUM_LENGTH"). value):

 RT_Charactar_Maximum_Length = (ValRS(Rs, "CHARACTER_MAXIMUM_LENGTH"))
        rt_Tipo = (ValRS(Rs, "DATA_TYPE"))

0

Поскольку некоторые люди спрашивали о точности и с типом данных, я хотел бы поделиться своим сценарием, который я создал для этой цели.

SELECT TABLE_NAME As 'TableName'
       COLUMN_NAME As 'ColumnName'
       CONCAT(DATA_TYPE, '(', COALESCE(CHARACTER_MAXIMUM_LENGTH, NUMERIC_PRECISION, DATETIME_PRECISION, ''), IIF(NUMERIC_SCALE <> 0, CONCAT(', ', NUMERIC_SCALE), ''), ')', IIF(IS_NULLABLE = 'YES', ', null', ', not null')) As 'ColumnType'
FROM INFORMATION_SCHEMA.COLUMNS
WHERE -- ...
ORDER BY 'TableName', 'ColumnName'

Это не идеально, но работает в большинстве случаев.

С помощью Sql-Server


-1

Другой вариант для MS SQL - заменить selectзапрос здесь запросом, для которого вы хотите типы:

declare @sql varchar(4000);

set @sql = 'select ''hi'' as greeting';

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.