Gibt es eine SQL-Anweisung, die den Typ einer Spalte in einer Tabelle zurückgeben kann?
Antworten
Zu viele Anzeigen?- 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)
ydecimal(10,5)
dann wird die Ausgabe seinnvarchar
,datetime2
ydecimal
beziehungsweise.- Dies ist ein Problem, weil eine Spalte, die als
nvarchar
(ohne(max)
o(123)
) ist dasselbe wienvarchar(1)
und mitdecimal
ist dasselbe wiedecimal(18,0)
die keine nicht-ganzzahligen Werte speichern können .
- Dies ist ein Problem, weil eine Spalte, die als
- Die Lösung ist auch betrachten
CHARACTER_OCTET_LENGTH
(fürbinary
),CHARACTER_MAXIMUM_LENGTH
(fürchar
ynchar
),DATETIME_PRECISION
(fürdatetime2
ydatetimeoffset
), undNUMERIC_PRECISION
conNUMERIC_SCALE
(fürdecimal
ynumeric
), um die Parameterwerte des Typs zu rekonstruieren.- Beachten Sie, dass
float(n)
kann ignoriert werden, da SQL Server nurfloat(24)
yfloat(53)
die als Aliasing fürreal
yfloat
jeweils imDATA_TYPE
Spalte.
- Beachten Sie, dass
- Zum Beispiel, wenn drei Spalten wie folgt eingegeben werden
- Diese Ansicht ist
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:
HackyStack
Punkte
4729
Hanif Azhari
Punkte
621
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`;
jTC
Punkte
1330
- See previous answers
- Weitere Antworten anzeigen