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?


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'

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'

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

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 = ''

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

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`;

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]');

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.


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'

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.).


3

Para IBM DB2 :

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

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

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


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

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]

1
SHOW COLUMNS FROM //table_name// ;

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



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')

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"))

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


-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);
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.