Existe-t-il une instruction SQL pouvant renvoyer le type d'une colonne dans une table?
Utilisation de SQL Server:
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'yourTableName' AND
COLUMN_NAME = 'yourColumnName'
Le moyen le plus simple dans TSQL est:
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
Pour SQL Server, cette procédure stockée système renverra toutes les informations de la table, y compris les types de données de colonne:
exec sp_help YOURTABLENAME
En SQL/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.system_type_id = c.system_type_id
WHERE t.name = ''
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
Si vous utilisez MySQL, vous pouvez essayer
SHOW COLUMNS FROM `tbl_name`;
MONTRER LES COLONNES sur dev.mysql.com
Sinon, vous devriez pouvoir faire
DESCRIBE `tbl_name`;
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]');
Pour IBM DB2 :
SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'
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, qui vous montreront les noms des colonnes et les types de données de ces colonnes (ints, varchars, etc.).
Utilisation de TSQL/MSSQL
Cette requête vous permettra d'obtenir: le nom de la table, le nom de la colonne, le type de données, la longueur du type de données et les 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 à changer est votre_nom_table.
Dans mon cas, j’avais besoin d’obtenir le type de données pour le SQL dynamique (Shudder!). 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 renverrait DECIMAL (18,4): dbo.GetLiteralDataType
SHOW COLUMNS FROM //table_name// ;
Il vous donnera des informations sur toutes les colonnes de la table.
Utilisez cette requête pour obtenir Schema, Table, Column, Type, longueur_max, 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]
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')
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")))
'and sample (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"))
Pour Spark SQL :
DESCRIBE [db_name.]table_name column_name
Pour récupérer les types de données déclarés réels, par exemple pour une utilisation dans SQL dynamique vers ALTER COLUMN, vous pouvez utiliser quelque chose comme ceci:
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
Utilisation de TSQL/MSSQL
Vous pouvez utiliser le mot clé INTO
.
Le résultat de SELECT
dans un réel TABLE
Exemple: select .... INTO real_table_name
Après
sp_help real_table_name
Comme certaines personnes demandaient également la précision du type de données, j'aimerais partager le 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.
Utiliser Sql-Server