Existe-t-il une instruction SQL qui peut renvoyer le type d'une colonne dans une table?
INFORMATION_SCHEMA.COLUMNS
tableau - si votre SGBDR en dispose.
Existe-t-il une instruction SQL qui peut renvoyer le type d'une colonne dans une table?
INFORMATION_SCHEMA.COLUMNS
tableau - si votre SGBDR en dispose.
Réponses:
Utilisation de SQL Server:
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'yourTableName' AND
COLUMN_NAME = 'yourColumnName'
AND TABLE_SCHEMA = 'yourSchema'
varchar(255)
au lieu de varchar
et int(11)
au lieu de int
?
CHARACTER_MAXIMUM_LENGTH
dans INFORMATION_SCHEMA.COLUMNS
. Faites juste un SELECT * FROM INFORMATION_SCHEMA.COLUMNS
pour voir toutes les colonnes disponibles.
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 renvoie toutes les informations de table, y compris les types de données de colonne:
exec sp_help YOURTABLENAME
Alt+F1
.. donne le même résultat.
Alt+F1
. Pas dans la solution Object Explorer. Ceci est une fonctionnalité très utile
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 = ''
JOIN sys.types y ON y.user_type_id = c.user_type_id
system_type_id n'est pas unique. doc sys.columns
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`;
DESCRIBE
syntaxe est également valable dans Oracle, mais MsSQL n'acceptera pas cette syntaxe.
information_schema.COLUMNS
.
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]');
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.
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'
WHEN
ligne:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
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.).
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
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
Utilisation de TSQL / MSSQL
Vous pouvez utiliser un INTO
mot-clé.
Le résultat de SELECT
dans une vraie table
Exemple: select .... INTO real_table_name
Après
sp_help real_table_name
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]
SHOW COLUMNS FROM //table_name// ;
Il vous donnera des informations sur toutes les colonnes du tableau.
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")))
'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"))
É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
Une autre option pour MS SQL consiste à remplacer la select
requê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);
sys.syscolumns
table par exemple.