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


301

Чи є оператор SQL, який може повернути тип стовпця в таблиці?


5
Залежить від RDBMS; sys.syscolumnsНаприклад, у таблиці SQL Server є таблиця.
LittleBobbyTables - Au Revoir

3
Так, але це буде різним залежно від типу RDBMS, який ви використовуєте - SQL - це мова, а не продукт бази даних, і це питання покладається на конкретний продукт. Ви зможете знайти подібну інформацію в INFORMATION_SCHEMA.COLUMNSтаблиці - якщо її має RDBMS.
Міст

Відповіді:


460

Використання SQL Server:

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

11
Тільки якщо ви не хочете бачити відповідну назву стовпця. Це поверне лише типи. Якщо ви хочете побачити назву стовпця, якому належить тип, вам також потрібно вибрати COLUMN_NAME ...
HackyStack

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.column 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 АБО ОПИСАНО (залежно від СУБД, яку ви використовуєте) корисною для невеликих таблиць з 3 або 4 стовпцями, тоді вона показує структуру таблиці з назвою стовпця Nullable прапор та типом стовпців для великих таблиць, однак для повернення результату потрібно більше часу важче знайти ту інформацію, яка вам потрібна.
швидкість

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') - видалити системну таблицю
Iannick

І 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

Це поверне значення Ім'я стовпця, показуючи назви стовпців та Типи даних цих стовпців (ints, 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

У моєму випадку мені потрібно було отримати тип даних для Dynamic 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") значення):

 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.