Istruzione SQL per ottenere il tipo di colonna


302

Esiste un'istruzione SQL che può restituire il tipo di una colonna in una tabella?


5
Dipende dal RDBMS; SQL Server ha la sys.syscolumnstabella per esempio.
LittleBobbyTables - Au Revoir

3
Sì, ma sarà diverso a seconda del tipo di RDBMS che stai utilizzando: SQL è un linguaggio, non il prodotto del database, e questa domanda si basa sul prodotto specifico. Sarai in grado di trovare questo tipo di informazioni nella INFORMATION_SCHEMA.COLUMNStabella, se il tuo RDBMS ce l'ha.
Ponte

Risposte:


461

Utilizzando SQL Server:

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

11
Solo se non vuoi vedere il nome della colonna corrispondente. Questo restituirà solo i tipi. Se vuoi vedere il nome della colonna a cui appartiene il tipo, devi selezionare anche COLUMN_NAME ...
HackyStack

5
E se la tabella non è nello schema predefinito, è possibile estendere la condizione conAND TABLE_SCHEMA = 'yourSchema'
luviktor

8
questo è fantastico - ma è anche possibile che restituisca l'intervallo per il tipo di colonna? cioè varchar(255)invece di varchare int(11)invece di int?
Don Cheadle,

13
@mmcrae: è possibile utilizzare la colonna CHARACTER_MAXIMUM_LENGTHin INFORMATION_SCHEMA.COLUMNS. Basta fare un SELECT * FROM INFORMATION_SCHEMA.COLUMNSper vedere tutte le colonne disponibili.
Francis P

2
Che dire delle tabelle temporanee?
Ilya Gazman,

77

Il modo più semplice in TSQL è:

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

44

Per SQL Server, questa procedura memorizzata dal sistema restituirà tutte le informazioni sulla tabella, inclusi i tipi di dati della colonna:

exec sp_help YOURTABLENAME

5
Ho votato perché questa non è esattamente la risposta ma mi fornisce informazioni preziose. Ad esempio le informazioni "IsComputed" che non ho trovato nello schema Informazioni, ma posso trovare nel codice della procedura sp_help e copiarle da lì.
Christoph,

2
seleziona il nome della tabella e fai clic Alt+F1.. dà lo stesso risultato.
Pugal,

per chiarire: il nome della tabella o della vista deve essere selezionato nell'editor e quindi premere Alt+F1. Non nella soluzione Esplora oggetti. Questa è una funzione così utile
bugybunny

18

In TSQL / MSSQL sembra che:

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
In realtà è JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id non è univoco. sys.columns doc
Fabricio,

12

in Oracle Oracle faresti questo:

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

9

Se stai usando MySQL potresti provare

SHOW COLUMNS FROM `tbl_name`;

MOSTRA COLONNE su dev.mysql.com

Altrimenti dovresti essere in grado di fare

DESCRIBE `tbl_name`;

1
Con altrimenti intendi altri RDBMS oltre a MySQL?
Lamak,

2
Sì. La DESCRIBEsintassi è valida anche in Oracle, tuttavia MsSQL non accetterà questa sintassi.
Fima

Vedi la risposta di @jTC per il metodo su MSSQL e TSQL.
Fima

Le versioni più recenti di MySQL hanno information_schema.COLUMNS.
Rick James,

Trovo DESC O DESCRIBE (a seconda del DBMS che usi) utile per le piccole tabelle con 3 o 4 colonne, quindi mostra la struttura della tabella con il nome della colonna Flag nullable e il tipo di colonna per le tabelle grandi, tuttavia ci vuole più tempo per restituire un risultato e è più difficile trovare le informazioni di cui hai bisogno.
velocità

7

Un'altra variante che utilizza MS SQL:

SELECT TYPE_NAME(system_type_id) 
FROM sys.columns 
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');

4

Utilizzando TSQL / MSSQL

Questa query ti porterà: nome della tabella, nome della colonna, tipo di dati, lunghezza del tipo di dati e valori null consentiti

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

L'unica cosa che deve essere cambiata è your_table_name.


4

Per basarsi sulle risposte di cui sopra, è spesso utile ottenere il tipo di dati della colonna nello stesso formato necessario per dichiarare le colonne.

Ad esempio, varchar(50), varchar(max), decimal(p, s).

Questo ti permette di farlo:

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
Questa avrebbe dovuto essere la risposta accettata. Grazie, forse puoi aggiungere la condizione (t.type = 'U') - rimuovere la tabella di sistema
Iannick

E i tipi VARBINARY potrebbero essere facilmente soddisfatti aggiungendoli alla prima WHENriga:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Reversed Engineer

3
USE [YourDatabaseName]
GO

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

Ciò restituirà i valori Nome colonna, mostrandoti i nomi delle colonne e i Tipi di dati di quelle colonne (ints, varchars, ecc.).


3

Per IBM DB2 :

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

2

Per recuperare i tipi di dati dichiarati effettivi, ad esempio per l'uso in SQL dinamico su ALTER COLUMN, è possibile utilizzare qualcosa del genere:

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

Nel mio caso avevo bisogno di ottenere il tipo di dati per SQL dinamico (Shudder!) Comunque qui è una funzione che ho creato che restituisce il tipo di dati completo. Ad esempio invece di restituire 'decimale' restituirebbe DECIMAL (18,4): dbo.GetLiteralDataType


1

Utilizzando TSQL / MSSQL

Puoi usare INTO parola chiave.

Il risultato di SELECT una vera TAVOLA

Esempio: select .... INTO real_table_name

Dopo

sp_help real_table_name

1

Utilizzare questa query per ottenere Schema, Tabella, Colonna, 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// ;

Ti darà informazioni su tutte le colonne della tabella.



0

Per Apache Derby come mostrato in questa risposta :

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

0

In vb60 puoi farlo:

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 è la mia funzione per rs.fields ("CHARACTER_MAXIMUM_LENGTH"). valore):

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

0

Dato che alcune persone chiedevano la precisione anche con il tipo di dati, vorrei condividere il mio script che ho creato a tale scopo.

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'

Non è perfetto ma funziona nella maggior parte dei casi.

utilizzando Sql-Server


-1

Un'altra opzione per MS SQL è quella di sostituire la selectquery qui con la query per la quale desideri i tipi:

declare @sql varchar(4000);

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

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.