470 Stimmen

SQL-Anweisung zur Ermittlung des Spaltentyps

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

656voto

Francis P Punkte 13097
  • In ISO SQL (d.h. Die meisten RDBMS heute) können Sie die INFORMATION_SCHEMA.COLUMNS Ansicht, die SQL Server unterstützt .
    • Diese Ansicht ist DATA_TYPE Spalte enthält die T-SQL/SQL Server-Typnamen, außer dass es nicht Argumente für parametrisierte Typen einschließen, was zu unerwartetem/ungewolltem Spaltenverhalten führen kann.
      • Zum Beispiel, wenn drei Spalten wie folgt eingegeben werden nvarchar(max) , datetime2(3) y decimal(10,5) dann wird die Ausgabe sein nvarchar , datetime2 y decimal beziehungsweise.
        • Dies ist ein Problem, weil eine Spalte, die als nvarchar (ohne (max) o (123) ) ist dasselbe wie nvarchar(1) und mit decimal ist dasselbe wie decimal(18,0) die keine nicht-ganzzahligen Werte speichern können .
      • Die Lösung ist auch betrachten CHARACTER_OCTET_LENGTH (für binary ), CHARACTER_MAXIMUM_LENGTH (für char y nchar ), DATETIME_PRECISION (für datetime2 y datetimeoffset ), und NUMERIC_PRECISION con NUMERIC_SCALE (für decimal y numeric ), um die Parameterwerte des Typs zu rekonstruieren.
        • Beachten Sie, dass float(n) kann ignoriert werden, da SQL Server nur float(24) y float(53) die als Aliasing für real y float jeweils im DATA_TYPE Spalte.

WITH q AS (

    SELECT
        c.TABLE_SCHEMA,
        c.TABLE_NAME,
        c.ORDINAL_POSITION,
        c.COLUMN_NAME,
        c.DATA_TYPE,
        CASE
            WHEN c.DATA_TYPE IN ( N'binary', N'varbinary'                    ) THEN ( CASE c.CHARACTER_OCTET_LENGTH   WHEN -1 THEN N'(max)' ELSE CONCAT( N'(', c.CHARACTER_OCTET_LENGTH  , N')' ) END )
            WHEN c.DATA_TYPE IN ( N'char', N'varchar', N'nchar', N'nvarchar' ) THEN ( CASE c.CHARACTER_MAXIMUM_LENGTH WHEN -1 THEN N'(max)' ELSE CONCAT( N'(', c.CHARACTER_MAXIMUM_LENGTH, N')' ) END )
            WHEN c.DATA_TYPE IN ( N'datetime2', N'datetimeoffset'            ) THEN CONCAT( N'(', c.DATETIME_PRECISION, N')' )
            WHEN c.DATA_TYPE IN ( N'decimal', N'numeric'                     ) THEN CONCAT( N'(', c.NUMERIC_PRECISION , N',', c.NUMERIC_SCALE, N')' )
        END AS DATA_TYPE_PARAMETER,
        CASE c.IS_NULLABLE
            WHEN N'NO'  THEN N' NOT NULL'
            WHEN N'YES' THEN     N' NULL'
        END AS IS_NULLABLE2
    FROM
        INFORMATION_SCHEMA.COLUMNS AS c
)
SELECT
    q.TABLE_SCHEMA,
    q.TABLE_NAME,
    q.ORDINAL_POSITION,
    q.COLUMN_NAME,
    CONCAT( q.DATA_TYPE, ISNULL( q.DATA_TYPE_PARAMETER, N'' ), q.IS_NULLABLE2 ) AS FULL_DATA_TYPE

FROM
    q
WHERE
    q.TABLE_SCHEMA = 'yourSchemaName' AND
    q.TABLE_NAME   = 'yourTableName'  AND 
    q.COLUMN_NAME  = 'yourColumnName'

ORDER BY
    q.TABLE_SCHEMA,
    q.TABLE_NAME,
    q.ORDINAL_POSITION;

Das Ergebnis sieht wie folgt aus:

enter image description here

150voto

HackyStack Punkte 4729

Der einfachste Weg in TSQL ist:

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

70voto

Hanif Azhari Punkte 621

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

exec sp_help YOURTABLENAME

30voto

fimas Punkte 548

Wenn Sie MySQL verwenden, können Sie versuchen

SHOW COLUMNS FROM `tbl_name`;

SHOW COLUMNS auf dev.mysql.com

Ansonsten sollten Sie in der Lage sein, Folgendes zu tun

DESCRIBE `tbl_name`;

29voto

jTC Punkte 1330

In TSQL/MSSQL sieht das 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 = ''

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X