Instrução SQL para obter o tipo de coluna


302

Existe uma instrução SQL que pode retornar o tipo de uma coluna em uma tabela?


5
Depende do RDBMS; SQL Server tem a sys.syscolumnstabela por exemplo.
LittleBobbyTables - Au Revoir

3
Sim, mas será diferente dependendo do tipo de RDBMS que você está usando - SQL é uma linguagem, não o produto de banco de dados, e essa pergunta depende do produto específico. Você poderá encontrar esse tipo de informação na INFORMATION_SCHEMA.COLUMNStabela - se o seu RDBMS tiver.
Ponte

Respostas:


461

Usando o SQL Server:

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'yourTableName' AND 
     COLUMN_NAME = 'yourColumnName'

11
Somente se você não quiser ver o nome da coluna correspondente. Isso retornará apenas os tipos. Se você quiser ver o nome da coluna do tipo pertence a você precisará selecionar COLUMN_NAME também ...
HackyStack

5
E se a tabela não está no esquema padrão você pode estender a condição comAND TABLE_SCHEMA = 'yourSchema'
luviktor

8
isso é ótimo - mas é possível também que ele retorne o intervalo para o tipo de coluna? ou seja, em varchar(255)vez de varchare em int(11)vez de int?
Don Cheadle

13
@mmcrae: É possível utilizar coluna CHARACTER_MAXIMUM_LENGTHem INFORMATION_SCHEMA.COLUMNS. Basta fazer um SELECT * FROM INFORMATION_SCHEMA.COLUMNSpara ver todas as colunas disponíveis.
Francis P

2
E as tabelas temporárias?
Ilya Gazman

77

A maneira mais fácil no TSQL é:

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

44

Para o SQL Server, este procedimento armazenado no sistema retornará todas as informações da tabela, incluindo os tipos de dados da coluna:

exec sp_help YOURTABLENAME

5
Eu votei como esta, embora não seja exatamente a resposta, mas fornece informações valiosas para mim. Por exemplo, as informações "IsComputed" que não encontrei no esquema Information, mas posso encontrar no código do procedimento sp_help e copiar a partir daí.
Christoph

2
selecione o nome da tabela e clique em Alt+F1.. fornece o mesmo resultado.
Pugal 28/09

para esclarecer: o nome da tabela ou da visualização deve ser selecionado no editor e pressione Alt+F1. Não está na solução Object Explorer. Isto é uma característica útil
bugybunny

18

No TSQL / MSSQL, ele se parece com:

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
Na verdade, é JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id não é exclusivo. sys.columns doc
Fabricio

12

no oracle SQL, você faria o seguinte:

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

9

Se você estiver usando o MySQL, você pode tentar

SHOW COLUMNS FROM `tbl_name`;

MOSTRAR COLUNAS em dev.mysql.com

Caso contrário, você deve ser capaz de fazer

DESCRIBE `tbl_name`;

1
Com o contrário, você quer dizer outro RDBMS além do MySQL?
Lamak

2
Sim. A DESCRIBEsintaxe também é válida no Oracle, no entanto, o MsSQL não aceitará essa sintaxe.
Fev

Veja a resposta do @jTC para o método MSSQL e TSQL.
fimas 15/11/12

Versões mais recentes do MySQL têm information_schema.COLUMNS.
21715 Rick Rick James

Acho DESC OR DESCRIBE (dependendo do DBMS que você usa) útil para pequenas tabelas com 3 ou 4 colunas, em seguida, mostra a estrutura da tabela com o nome da coluna Sinalizador anulável e tipo de coluna para tabelas grandes, no entanto, leva mais tempo para retornar um resultado e é mais difícil encontrar as informações que você precisa.
Velocidade #

7

Outra variação usando o 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 fornecerá: nome da tabela, nome da coluna, tipo de dados, comprimento do tipo de dados e nulos permitidos

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

A única coisa que precisa ser alterada é your_table_name.


4

Para desenvolver as respostas acima, geralmente é útil obter o tipo de dados da coluna no mesmo formato que você precisa para declarar colunas.

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

Isso permite que você faça isso:

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
Essa deveria ter sido a resposta aceita. Obrigado, talvez você possa adicionar a condição (t.type = 'U') - remover a tabela do sistema
Iannick

E os tipos VARBINARES podem ser facilmente atendidos adicionando-os à primeira WHENlinha:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Engenheiro reverso

3
USE [YourDatabaseName]
GO

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

Isso retornará os valores Nome da coluna, mostrando os nomes das colunas e os Tipos de dados dessas colunas (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 os tipos de dados declarados reais, por exemplo, para uso em SQL dinâmico para ALTER COLUMNs, algo como isto pode ser usado:

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

No meu caso, eu precisava obter o tipo de dados para SQL dinâmico (Shudder!) De qualquer maneira, aqui está uma função que eu criei que retorna o tipo de dados completo. Por exemplo, em vez de retornar 'decimal', retornaria DECIMAL (18,4): dbo.GetLiteralDataType


1

Usando TSQL / MSSQL

Você pode usar a INTOpalavra-chave.

O resultado de SELECTem uma tabela real

Exemplo: select .... INTO real_table_name

Depois de

sp_help real_table_name

1

Use esta consulta para obter Esquema, Tabela, Coluna, 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// ;

Ele fornecerá informações sobre todas as colunas da tabela.



0

Para o Apache Derby, como mostrado nesta resposta :

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

0

No vb60, você pode fazer isso:

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

'e sample (valRs é minha função para rs.fields ("CHARACTER_MAXIMUM_LENGTH"). value):

 RT_Charactar_Maximum_Length = (ValRS(Rs, "CHARACTER_MAXIMUM_LENGTH"))
        rt_Tipo = (ValRS(Rs, "DATA_TYPE"))

0

Como algumas pessoas pediam a precisão e o tipo de dados, eu gostaria de compartilhar meu script que criei para esse fim.

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'

Não é perfeito, mas funciona na maioria dos casos.

Usando Sql-Server


-1

Outra opção para o MS SQL é substituir a selectconsulta aqui pela consulta para a qual você deseja os tipos:

declare @sql varchar(4000);

set @sql = 'select ''hi'' as greeting';

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.