Instruction SQL pour obtenir le type de colonne

302

Existe-t-il une instruction SQL qui peut renvoyer le type d'une colonne dans une table?

daniely
la source
5
Dépend du SGBDR; SQL Server a la sys.syscolumnstable par exemple.
LittleBobbyTables - Au Revoir
3
Oui, mais ce sera différent selon le type de SGBDR que vous utilisez - SQL est un langage, pas le produit de base de données, et cette question dépend du produit spécifique. Vous pourrez trouver ce type d'informations dans le INFORMATION_SCHEMA.COLUMNStableau - si votre SGBDR en dispose.
Pont du

Réponses:

461

Utilisation de SQL Server:

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'yourTableName' AND 
     COLUMN_NAME = 'yourColumnName'
Francis P
la source
11
Uniquement si vous ne souhaitez pas voir le nom de colonne correspondant. Cela ne renverra que les types. Si vous voulez voir le nom de la colonne à laquelle le type appartient, vous devrez également sélectionner COLUMN_NAME ...
HackyStack
5
Et si votre table n'est pas dans le schéma par défaut, vous pouvez étendre la condition avecAND TABLE_SCHEMA = 'yourSchema'
luviktor
8
c'est très bien - mais est-il possible de lui aussi retourner la plage pour le type de colonne? c'est à dire varchar(255)au lieu de varcharet int(11)au lieu de int?
Don Cheadle
13
@mmcrae: Il est possible d'utiliser la colonne CHARACTER_MAXIMUM_LENGTHdans INFORMATION_SCHEMA.COLUMNS. Faites juste un SELECT * FROM INFORMATION_SCHEMA.COLUMNSpour voir toutes les colonnes disponibles.
Francis P
2
Et les tables temporaires?
Ilya Gazman
77

Le moyen le plus simple dans TSQL est:

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'yourTableName'
HackyStack
la source
44

Pour SQL Server, cette procédure stockée système renvoie toutes les informations de table, y compris les types de données de colonne:

exec sp_help YOURTABLENAME
Hanif Azhari
la source
5
J'ai voté positivement car ce n'est pas exactement la réponse, mais cela me fournit de précieuses informations. Par exemple, les informations "IsComputed" que je n'ai pas trouvées dans le schéma Information mais que je peux trouver dans le code de procédure sp_help et copier à partir de là.
Christoph
2
sélectionnez le nom de la table et cliquez sur Alt+F1.. donne le même résultat.
Pugal
pour clarifier: le nom de la table ou de la vue doit être sélectionné dans l'éditeur puis appuyer sur Alt+F1. Pas dans la solution Object Explorer. Ceci est une fonctionnalité très utile
bugybunny
18

Dans TSQL / MSSQL, cela ressemble à:

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 = ''
jTC
la source
2
En fait, c'est JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id n'est pas unique. doc sys.columns
Fabricio
12

dans oracle SQL, vous feriez ceci:

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

Si vous utilisez MySQL, vous pouvez essayer

SHOW COLUMNS FROM `tbl_name`;

AFFICHER LES COLONNES sur dev.mysql.com

Sinon, vous devriez pouvoir faire

DESCRIBE `tbl_name`;
fimas
la source
1
Dans le cas contraire, vous voulez dire d'autres SGBDR en dehors de MySQL?
Lamak
2
Oui. La DESCRIBEsyntaxe est également valable dans Oracle, mais MsSQL n'acceptera pas cette syntaxe.
fimas
Voir la réponse de @jTC pour la méthode sur MSSQL et TSQL.
fimas
Les nouvelles versions de MySQL ont information_schema.COLUMNS.
Rick James
Je trouve DESC OU DESCRIBE (selon le SGBD que vous utilisez) utile pour les petites tables à 3 ou 4 colonnes, puis il montre la structure de la table avec le nom de la colonne Indicateur Nullable et le type de colonne pour les grandes tables, mais cela prend plus de temps pour renvoyer un résultat et il est plus difficile de trouver les informations dont vous avez besoin.
velocity
7

Une autre variante utilisant MS SQL:

SELECT TYPE_NAME(system_type_id) 
FROM sys.columns 
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');
Arne H. Bitubekk
la source
4

Utilisation de TSQL / MSSQL

Cette requête vous obtiendra: nom de la table, nom de la colonne, type de données, longueur du type de données et valeurs NULL autorisées

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

La seule chose qui doit être modifiée est votre_nom_table.

csebryam
la source
4

Pour s'appuyer sur les réponses ci-dessus, il est souvent utile d'obtenir le type de données de colonne dans le même format que celui dont vous avez besoin pour déclarer des colonnes.

Par exemple, varchar(50), varchar(max),decimal(p, s) .

Cela vous permet de faire cela:

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'
MgSam
la source
1
Cela aurait dû être la réponse acceptée. Merci, vous pouvez peut-être ajouter la condition (t.type = 'U') - supprimer la table système
Iannick
Et les types VARBINARY pourraient facilement être pris en charge en ajoutant cela à la première WHENligne:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Ingénieur inversé
3
USE [YourDatabaseName]
GO

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

Cela renverra les valeurs Nom de colonne, vous montrant les noms des colonnes et les types de données de ces colonnes (ints, varchars, etc.).

Kprof
la source
3

Pour IBM DB2 :

SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'
Un homme
la source
2

Pour récupérer les types de données déclarés réels, par exemple pour une utilisation en SQL dynamique vers ALTER COLUMN, quelque chose comme ceci peut être utilisé:

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
AjV Jsy
la source
1

Dans mon cas, j'avais besoin d'obtenir le type de données pour Dynamic SQL (Shudder!) De toute façon voici une fonction que j'ai créée qui renvoie le type de données complet. Par exemple, au lieu de renvoyer «décimal», il retournerait DECIMAL (18,4): dbo.GetLiteralDataType

Anthony Griggs
la source
1

Utilisation de TSQL / MSSQL

Vous pouvez utiliser un INTOmot-clé.

Le résultat de SELECTdans une vraie table

Exemple: select .... INTO real_table_name

Après

sp_help real_table_name
Geza Bartha
la source
1

Utilisez cette requête pour obtenir le schéma, la table, la colonne, le type, 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]
Jigar Parekh
la source
1
SHOW COLUMNS FROM //table_name// ;

Il vous donnera des informations sur toutes les colonnes du tableau.

Somil Gupta
la source
0

Pour Apache Derby, comme indiqué dans cette réponse :

select columndatatype from sys.syscolumns
  where referenceid = (
    select tableid from sys.systables
    where tablename = 'YOUR_TABEL_NAME'
    and columnname= 'YOUR_COLUMN_NAME')
Michael
la source
0

Dans vb60, vous pouvez faire ceci:

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

'et échantillon (valRs est ma fonction pour rs.fields ("CHARACTER_MAXIMUM_LENGTH"). value):

 RT_Charactar_Maximum_Length = (ValRS(Rs, "CHARACTER_MAXIMUM_LENGTH"))
        rt_Tipo = (ValRS(Rs, "DATA_TYPE"))
R.Alonso
la source
0

Étant donné que certaines personnes demandaient également la précision du type de données, je voudrais partager mon script que j'ai créé à cette fin.

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'

Ce n'est pas parfait mais cela fonctionne dans la plupart des cas.

En utilisant Sql-Server

Alexander Shuev
la source
-1

Une autre option pour MS SQL consiste à remplacer la selectrequête ici par la requête pour laquelle vous voulez les types:

declare @sql varchar(4000);

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

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
Bob Krieter
la source