¿Hay una instrucción SQL que pueda devolver el tipo de una columna en una tabla?
INFORMATION_SCHEMA.COLUMNS
tabla, si su RDBMS lo tiene.
¿Hay una instrucción SQL que pueda devolver el tipo de una columna en una tabla?
INFORMATION_SCHEMA.COLUMNS
tabla, si su RDBMS lo tiene.
Respuestas:
Usando SQL Server:
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'yourTableName' AND
COLUMN_NAME = 'yourColumnName'
AND TABLE_SCHEMA = 'yourSchema'
varchar(255)
lugar de varchar
y en int(11)
lugar de int
?
CHARACTER_MAXIMUM_LENGTH
en INFORMATION_SCHEMA.COLUMNS
. Simplemente haga una SELECT * FROM INFORMATION_SCHEMA.COLUMNS
para ver todas las columnas disponibles.
La forma más fácil en TSQL es:
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
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
Alt+F1
.. da el mismo resultado.
Alt+F1
. No en la solución Object Explorer. Esta es una característica muy útil
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 = ''
JOIN sys.types y ON y.user_type_id = c.user_type_id
system_type_id no es único. sys.columns doc
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`;
DESCRIBE
sintaxis también es válida en Oracle, sin embargo, MsSQL no aceptará esta sintaxis.
information_schema.COLUMNS
.
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]');
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.
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'
WHEN
línea: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
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.).
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
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
Usando TSQL / MSSQL
Puedes usar la INTO
palabra clave.
El resultado de SELECT
en una TABLA real
Ejemplo: select .... INTO real_table_name
Después
sp_help real_table_name
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]
SHOW COLUMNS FROM //table_name// ;
Le dará información sobre todas las columnas de la tabla.
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')
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"))
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
Otra opción para MS SQL es reemplazar la select
consulta 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);
sys.syscolumns
tabla, por ejemplo.