Sentencia SQL para obtener el tipo de columna

302

¿Hay una instrucción SQL que pueda devolver el tipo de una columna en una tabla?

daniely
fuente
55
Depende del RDBMS; SQL Server tiene la sys.syscolumnstabla, por ejemplo.
LittleBobbyTables - Au Revoir
3
Sí, pero será diferente según el tipo de RDBMS que esté utilizando: SQL es un lenguaje, no el producto de la base de datos, y esta pregunta se basa en el producto específico. Podrá encontrar este tipo de información en la INFORMATION_SCHEMA.COLUMNStabla, si su RDBMS lo tiene.
Puente

Respuestas:

461

Usando SQL Server:

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'yourTableName' AND 
     COLUMN_NAME = 'yourColumnName'
Francis P
fuente
11
Solo si no desea ver el nombre de la columna correspondiente. Esto solo devolverá los tipos. Si desea ver el nombre de la columna a la que pertenece el tipo, deberá seleccionar COLUMN_NAME también ...
HackyStack
55
Y si su tabla no está en el esquema predeterminado, puede extender la condición conAND TABLE_SCHEMA = 'yourSchema'
luviktor
8
esto es genial, pero ¿es posible que también devuelva el rango para el tipo de columna? es decir, en varchar(255)lugar de varchary en int(11)lugar de int?
Don Cheadle
13
@mmcrae: Es posible usar la columna CHARACTER_MAXIMUM_LENGTHen INFORMATION_SCHEMA.COLUMNS. Simplemente haga una SELECT * FROM INFORMATION_SCHEMA.COLUMNSpara ver todas las columnas disponibles.
Francis P
2
¿Qué pasa con las tablas temporales?
Ilya Gazman
77

La forma más fácil en TSQL es:

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

Para SQL Server, este procedimiento almacenado del sistema devolverá toda la información de la tabla, incluidos los tipos de datos de columna:

exec sp_help YOURTABLENAME
Hanif Azhari
fuente
55
He votado porque esta no es la respuesta exacta, pero me proporciona información valiosa. Por ejemplo, la información "IsComputed" que no encontré en el esquema de información pero que puedo encontrar en el código de procedimiento sp_help y copiar desde allí.
Christoph
2
seleccione el nombre de la tabla y haga clic en Alt+F1.. da el mismo resultado.
Pugal
para aclarar: el nombre de la tabla o vista debe seleccionarse en el editor y luego presionar Alt+F1. No en la solución Object Explorer. Esta es una característica muy útil
bugybunny
18

En TSQL / MSSQL se ve así:

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
fuente
2
En realidad es JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id no es único. sys.columns doc
Fabricio
12

en Oracle SQL harías esto:

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

Si está utilizando MySQL, puede intentar

SHOW COLUMNS FROM `tbl_name`;

MOSTRAR COLUMNAS en dev.mysql.com

De lo contrario, deberías poder hacer

DESCRIBE `tbl_name`;
fimas
fuente
1
¿De lo contrario te refieres a otros RDBMS aparte de MySQL?
Lamak
2
Si. La DESCRIBEsintaxis también es válida en Oracle, sin embargo, MsSQL no aceptará esta sintaxis.
fimas
Vea la respuesta de @jTC para el método en MSSQL y TSQL.
fimas
Las versiones más recientes de MySQL tienen information_schema.COLUMNS.
Rick James
Encuentro que DESC O DESCRIBE (según el DBMS que use) es útil para tablas pequeñas con 3 o 4 columnas, luego muestra la estructura de la tabla con el nombre de la columna Indicador anulable y tipo de columna para tablas grandes, sin embargo, lleva más tiempo devolver un resultado y Es más difícil encontrar la información que necesita.
velocidad
7

Otra variación con 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
fuente
4

Usando TSQL / MSSQL

Esta consulta obtendrá: nombre de la tabla, nombre de la columna, tipo de datos, longitud del tipo de datos y valores nulos permitidos

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

Lo único que debe cambiarse es your_table_name.

csebryam
fuente
4

Para construir sobre las respuestas anteriores, a menudo es útil obtener el tipo de datos de columna en el mismo formato que necesita para declarar columnas.

Por ejemplo, varchar(50), varchar(max), decimal(p, s).

Esto le permite hacer eso:

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
fuente
1
Esta debería haber sido la respuesta aceptada. Gracias, tal vez pueda agregar la condición (t.type = 'U') - eliminar la tabla del sistema
Iannick
Y los tipos VARBINARIOS podrían ser fácilmente atendidos agregando eso a la primera WHENlínea:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Ingeniero invertido
3
USE [YourDatabaseName]
GO

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

Esto devolverá los valores Nombre de columna, mostrándole los nombres de las columnas y los Tipos de datos de esas columnas (ints, varchars, etc.).

Kprof
fuente
3

Para IBM DB2 :

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

Para recuperar los tipos de datos declarados reales, por ejemplo, para su uso en SQL dinámico para ALTERAR COLUMNAS, se puede usar algo como esto:

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
fuente
1

En mi caso, necesitaba obtener el tipo de datos para Dynamic SQL (Shudder!) De todos modos, aquí hay una función que creé que devuelve el tipo de datos completo. Por ejemplo, en lugar de devolver 'decimal', devolvería DECIMAL (18,4): dbo.GetLiteralDataType

Anthony Griggs
fuente
1

Usando TSQL / MSSQL

Puedes usar la INTOpalabra clave.

El resultado de SELECTen una TABLA real

Ejemplo: select .... INTO real_table_name

Después

sp_help real_table_name
Geza Bartha
fuente
1

Use esta consulta para obtener el esquema, la tabla, la columna, el tipo, 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
fuente
1
SHOW COLUMNS FROM //table_name// ;

Le dará información sobre todas las columnas de la tabla.

Somil Gupta
fuente
0

Para Spark SQL :

DESCRIBE [db_name.]table_name column_name
ishwr_
fuente
0

Para Apache Derby como se muestra en esta respuesta :

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

En vb60 puedes hacer esto:

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

'y sample (valRs es mi función para rs.fields ("CHARACTER_MAXIMUM_LENGTH"). value):

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

Dado que algunas personas también solicitaban la precisión con el tipo de datos, me gustaría compartir mi script que he creado para tal 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'

No es perfecto, pero funciona en la mayoría de los casos.

Utilizando Sql-Server

Alexander Shuev
fuente
-1

Otra opción para MS SQL es reemplazar la selectconsulta aquí con la consulta para la que desea los tipos:

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
fuente