SQL-Anweisung zum Abrufen des Spaltentyps

302

Gibt es eine SQL-Anweisung, die den Typ einer Spalte in einer Tabelle zurückgeben kann?

Daniely
quelle
5
Hängt vom RDBMS ab; SQL Server hat die sys.syscolumnsTabelle zum Beispiel.
LittleBobbyTables - Au Revoir
3
Ja, aber es hängt davon ab, welche Art von RDBMS Sie verwenden. SQL ist eine Sprache, nicht das Datenbankprodukt, und diese Frage hängt vom jeweiligen Produkt ab. Sie können diese Art von Informationen in der INFORMATION_SCHEMA.COLUMNSTabelle finden - sofern Ihr RDBMS sie hat.
Brücke

Antworten:

461

Verwenden von SQL Server:

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'yourTableName' AND 
     COLUMN_NAME = 'yourColumnName'
Francis P.
quelle
11
Nur wenn Sie den entsprechenden Spaltennamen nicht sehen möchten. Dies gibt nur die Typen zurück. Wenn Sie den Spaltennamen sehen möchten, zu dem der Typ gehört, müssen Sie auch
COLUMN_NAME
5
Und wenn Ihre Tabelle nicht im Standardschema ist, können Sie die Bedingung mitAND TABLE_SCHEMA = 'yourSchema'
luviktor
8
Das ist großartig - aber ist es möglich, dass auch der Bereich für den Spaltentyp zurückgegeben wird? dh varchar(255)statt varcharund int(11)statt int?
Don Cheadle
13
@mmcrae: Es ist möglich, die Spalte CHARACTER_MAXIMUM_LENGTHin zu verwenden INFORMATION_SCHEMA.COLUMNS. Führen Sie einfach eine aus SELECT * FROM INFORMATION_SCHEMA.COLUMNS, um alle verfügbaren Spalten anzuzeigen.
Francis P
2
Was ist mit temporären Tabellen?
Ilya Gazman
77

Der einfachste Weg in TSQL ist:

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

Für SQL Server gibt diese gespeicherte Systemprozedur alle Tabelleninformationen zurück, einschließlich der Spaltendatentypen:

exec sp_help YOURTABLENAME
Hanif Azhari
quelle
5
Ich habe mich dafür ausgesprochen, da dies zwar nicht genau die Antwort ist, mir aber wertvolle Informationen liefert. ZB die "IsComputed" -Informationen, die ich nicht im Informationsschema gefunden habe, aber ich kann sie im Prozedurcode sp_help finden und von dort kopieren.
Christoph
2
Wählen Sie den Tabellennamen und klicken Sie auf Alt+F1.. ergibt das gleiche Ergebnis.
Pugal
Zur Verdeutlichung: Der Name der Tabelle oder Ansicht muss im Editor ausgewählt und dann gedrückt werden Alt+F1. Nicht im Lösungsobjekt-Explorer. Dies ist so eine hilfreiche Funktion
Bugybunny
18

In TSQL / MSSQL sieht es so aus:

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
quelle
2
Eigentlich ist es JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id ist nicht eindeutig. sys.columns doc
Fabricio
12

In Oracle SQL würden Sie dies tun:

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

Wenn Sie MySQL verwenden, können Sie es versuchen

SHOW COLUMNS FROM `tbl_name`;

SHOW COLUMNS auf dev.mysql.com

Andernfalls sollten Sie dazu in der Lage sein

DESCRIBE `tbl_name`;
Fimas
quelle
1
Mit sonst meinst du andere RDBMS außer MySQL?
Lamak
2
Ja. Die DESCRIBESyntax ist auch in Oracle gültig, MsSQL akzeptiert diese Syntax jedoch nicht.
Fimas
Siehe Antwort von @jTC für Methoden zu MSSQL und TSQL.
Fimas
Neuere Versionen von MySQL haben information_schema.COLUMNS.
Rick James
Ich finde DESC ODER DESCRIBE (abhängig von dem von Ihnen verwendeten DBMS) nützlich für kleine Tabellen mit 3 oder 4 Spalten. Dann wird die Tabellenstruktur mit dem Spaltennamen Nullable Flag und dem Spaltentyp für große Tabellen angezeigt. Es dauert jedoch länger, bis ein Ergebnis zurückgegeben wird Es ist schwieriger, die Informationen zu finden, die Sie benötigen.
Geschwindigkeit
7

Eine weitere Variante mit 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
quelle
4

Verwenden von TSQL / MSSQL

Mit dieser Abfrage erhalten Sie: Tabellenname, Spaltenname, Datentyp, Datentyplänge und zulässige Nullen

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

Das einzige, was geändert werden muss, ist Ihr_Tabellenname.

csebryam
quelle
4

Um auf den obigen Antworten aufzubauen, ist es häufig hilfreich, den Spaltendatentyp in demselben Format abzurufen, das Sie zum Deklarieren von Spalten benötigen.

Zum Beispiel varchar(50), varchar(max), decimal(p, s).

Dies ermöglicht Ihnen Folgendes:

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
quelle
1
Dies sollte die akzeptierte Antwort gewesen sein. Danke, vielleicht können Sie die Bedingung hinzufügen (t.type = 'U')
Systemtabelle
Und VARBINARY-Typen könnten leicht berücksichtigt werden, indem man dies in die erste WHENZeile einfügt :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

Dies gibt die Werte Spaltenname zurück und zeigt Ihnen die Namen der Spalten und die Datentypen dieser Spalten (Ints, Varchars usw.).

Kprof
quelle
3

Für IBM DB2 :

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

Um die tatsächlich deklarierten Datentypen abzurufen, z. B. für die Verwendung in dynamischem SQL, um SPALTEN ZU ÄNDERN, kann Folgendes verwendet werden:

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

In meinem Fall musste ich trotzdem den Datentyp für Dynamic SQL (Shudder!) Abrufen. Hier ist eine von mir erstellte Funktion, die den vollständigen Datentyp zurückgibt. Anstatt beispielsweise 'dezimal' zurückzugeben, wird DECIMAL (18,4): dbo.GetLiteralDataType zurückgegeben

Anthony Griggs
quelle
1

Verwenden von TSQL / MSSQL

Sie können ein INTOSchlüsselwort verwenden.

Das Ergebnis von SELECTin eine echte Tabelle

Beispiel: select .... INTO real_table_name

Nach

sp_help real_table_name
Geza Bartha
quelle
1

Verwenden Sie diese Abfrage, um Schema, Tabelle, Spalte, Typ, max_length, is_nullable abzurufen

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
quelle
1
SHOW COLUMNS FROM //table_name// ;

Sie erhalten Informationen zu allen Spalten in der Tabelle.

Somil Gupta
quelle
0

Für Spark SQL :

DESCRIBE [db_name.]table_name column_name
ishwr_
quelle
0

Für Apache Derby wie in dieser Antwort gezeigt :

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

In vb60 können Sie dies tun:

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

'und sample (valRs ist meine Funktion für rs.fields ("CHARACTER_MAXIMUM_LENGTH"). value):

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

Da einige Leute auch nach der Genauigkeit des Datentyps fragten, möchte ich mein Skript teilen, das ich für einen solchen Zweck erstellt habe.

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'

Es ist nicht perfekt, aber es funktioniert in den meisten Fällen.

Verwenden von Sql-Server

Alexander Shuev
quelle
-1

Eine weitere Option für MS SQL besteht darin, die selectAbfrage hier durch die Abfrage zu ersetzen, für die Sie die Typen möchten:

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
quelle