Apakah ada pernyataan SQL yang bisa mengembalikan tipe kolom dalam tabel?
INFORMATION_SCHEMA.COLUMNS
tabel - jika RDBMS Anda memilikinya.
Apakah ada pernyataan SQL yang bisa mengembalikan tipe kolom dalam tabel?
INFORMATION_SCHEMA.COLUMNS
tabel - jika RDBMS Anda memilikinya.
Jawaban:
Menggunakan SQL Server:
SELECT DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE
TABLE_NAME = 'yourTableName' AND
COLUMN_NAME = 'yourColumnName'
AND TABLE_SCHEMA = 'yourSchema'
varchar(255)
bukannya varchar
dan int(11)
bukannya int
?
CHARACTER_MAXIMUM_LENGTH
dalam INFORMATION_SCHEMA.COLUMNS
. Lakukan a SELECT * FROM INFORMATION_SCHEMA.COLUMNS
untuk melihat semua kolom yang tersedia.
Cara termudah dalam TSQL adalah:
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
Untuk SQL Server, prosedur yang disimpan sistem ini akan mengembalikan semua informasi tabel, termasuk tipe data kolom:
exec sp_help YOURTABLENAME
Alt+F1
.. memberikan hasil yang sama.
Alt+F1
. Tidak dalam solusi Object Explorer. Ini adalah fitur yang sangat membantu
Dalam TSQL / MSSQL sepertinya:
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 tidak unik. sys.columns doc
Jika Anda menggunakan MySQL, Anda bisa mencoba
SHOW COLUMNS FROM `tbl_name`;
TAMPILKAN KOLOM di dev.mysql.com
Kalau tidak, Anda harus dapat melakukannya
DESCRIBE `tbl_name`;
DESCRIBE
sintaks berlaku di Oracle juga, namun MSSQL tidak akan menerima sintaks ini.
information_schema.COLUMNS
.
Variasi lain menggunakan MS SQL:
SELECT TYPE_NAME(system_type_id)
FROM sys.columns
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');
Menggunakan TSQL / MSSQL
Kueri ini akan memberi Anda: nama tabel, nama kolom, tipe data, panjang tipe data, dan null yang diizinkan
SELECT TABLE_NAME,COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'your_table_name'
Satu-satunya hal yang perlu diubah adalah your_table_name.
Untuk membangun jawaban di atas, sering kali berguna untuk mendapatkan tipe data kolom dalam format yang sama dengan yang Anda butuhkan untuk mendeklarasikan kolom.
Sebagai contoh, varchar(50)
, varchar(max)
,decimal(p, s)
.
Ini memungkinkan Anda untuk melakukan itu:
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
baris pertama :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
Ini akan mengembalikan nilai-nilai Nama Kolom, menunjukkan kepada Anda nama-nama kolom, dan Tipe Data dari kolom tersebut (ints, varchars, dll).
Untuk IBM DB2 :
SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'
Untuk mengambil tipe data yang dinyatakan sebenarnya, misalnya untuk digunakan dalam SQL dinamis ke ALTER COLUMNs, sesuatu seperti ini dapat digunakan:
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
Dalam kasus saya, saya perlu mendapatkan tipe data untuk Dynamic SQL (Shudder!) Tetap di sini adalah fungsi yang saya buat yang mengembalikan tipe data lengkap. Misalnya, alih-alih mengembalikan 'desimal', itu akan mengembalikan DECIMAL (18,4): dbo.GetLiteralDataType
Menggunakan TSQL / MSSQL
Anda bisa menggunakan INTO
kata kunci.
Hasil dari SELECT
menjadi TABEL nyata
Contoh: select .... INTO real_table_name
Setelah
sp_help real_table_name
Gunakan kueri ini untuk mendapatkan Skema, Tabel, Kolom, Jenis, max_length, is_nullable
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// ;
Ini akan memberi Anda informasi tentang semua kolom dari tabel.
Untuk Apache Derby seperti yang ditunjukkan dalam jawaban ini :
select columndatatype from sys.syscolumns
where referenceid = (
select tableid from sys.systables
where tablename = 'YOUR_TABEL_NAME'
and columnname= 'YOUR_COLUMN_NAME')
Di vb60 Anda bisa melakukan ini:
Public Cn As ADODB.Connection
'open connection
Dim Rs As ADODB.Recordset
Set Rs = Cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, UCase("Table"), UCase("field")))
'dan sampel (valRs adalah fungsi saya untuk rs.fields ("CHARACTER_MAXIMUM_LENGTH"). nilai):
RT_Charactar_Maximum_Length = (ValRS(Rs, "CHARACTER_MAXIMUM_LENGTH"))
rt_Tipo = (ValRS(Rs, "DATA_TYPE"))
Karena beberapa orang meminta ketepatan juga dengan tipe data, saya ingin membagikan skrip yang saya buat untuk tujuan seperti itu.
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'
Itu tidak sempurna tetapi berfungsi dalam banyak kasus.
Menggunakan Sql-Server
Opsi lain untuk MS SQL adalah mengganti select
kueri di sini dengan kueri yang Anda inginkan jenisnya:
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
tabel misalnya.