Gibt es eine SQL-Anweisung, die den Typ einer Spalte in einer Tabelle zurückgeben kann?
INFORMATION_SCHEMA.COLUMNS
Tabelle finden - sofern Ihr RDBMS sie hat.
Gibt es eine SQL-Anweisung, die den Typ einer Spalte in einer Tabelle zurückgeben kann?
INFORMATION_SCHEMA.COLUMNS
Tabelle finden - sofern Ihr RDBMS sie hat.
Antworten:
Verwenden von SQL Server:
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'yourTableName' AND
COLUMN_NAME = 'yourColumnName'
AND TABLE_SCHEMA = 'yourSchema'
varchar(255)
statt varchar
und int(11)
statt int
?
CHARACTER_MAXIMUM_LENGTH
in zu verwenden INFORMATION_SCHEMA.COLUMNS
. Führen Sie einfach eine aus SELECT * FROM INFORMATION_SCHEMA.COLUMNS
, um alle verfügbaren Spalten anzuzeigen.
Der einfachste Weg in TSQL ist:
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
Für SQL Server gibt diese gespeicherte Systemprozedur alle Tabelleninformationen zurück, einschließlich der Spaltendatentypen:
exec sp_help YOURTABLENAME
Alt+F1
.. ergibt das gleiche Ergebnis.
Alt+F1
. Nicht im Lösungsobjekt-Explorer. Dies ist so eine hilfreiche Funktion
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 = ''
JOIN sys.types y ON y.user_type_id = c.user_type_id
system_type_id ist nicht eindeutig. sys.columns doc
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`;
DESCRIBE
Syntax ist auch in Oracle gültig, MsSQL akzeptiert diese Syntax jedoch nicht.
information_schema.COLUMNS
.
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]');
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.
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'
WHEN
Zeile einfügt :WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
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.).
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
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
Verwenden von TSQL / MSSQL
Sie können ein INTO
Schlüsselwort verwenden.
Das Ergebnis von SELECT
in eine echte Tabelle
Beispiel: select .... INTO real_table_name
Nach
sp_help real_table_name
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]
SHOW COLUMNS FROM //table_name// ;
Sie erhalten Informationen zu allen Spalten in der Tabelle.
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')
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"))
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
Eine weitere Option für MS SQL besteht darin, die select
Abfrage 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);
sys.syscolumns
Tabelle zum Beispiel.