SQL-Anweisung zum Abrufen des Spaltentyps


302

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


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'

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'

44

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

exec sp_help YOURTABLENAME

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

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

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

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

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.


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'

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


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'

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

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


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

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]

1
SHOW COLUMNS FROM //table_name// ;

Sie erhalten Informationen zu allen Spalten in der Tabelle.




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

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


-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);
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.