Pernyataan SQL untuk mendapatkan tipe kolom


302

Apakah ada pernyataan SQL yang bisa mengembalikan tipe kolom dalam tabel?


5
Tergantung pada RDBMS; SQL Server memiliki sys.syscolumnstabel misalnya.
LittleBobbyTables - Au Revoir

3
Ya, tetapi itu akan berbeda tergantung pada jenis RDBMS apa yang Anda gunakan - SQL adalah bahasa, bukan produk basis data, dan pertanyaan ini bergantung pada produk tertentu. Anda akan dapat menemukan informasi semacam ini di INFORMATION_SCHEMA.COLUMNStabel - jika RDBMS Anda memilikinya.
Jembatan

Jawaban:


461

Menggunakan SQL Server:

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

11
Hanya jika Anda tidak ingin melihat nama kolom yang sesuai. Ini hanya akan mengembalikan tipenya. Jika Anda ingin melihat nama kolom, jenis itu milik Anda, Anda juga harus memilih COLUMN_NAME ...
HackyStack

5
Dan jika meja Anda tidak ada dalam skema default, Anda dapat memperpanjang kondisi denganAND TABLE_SCHEMA = 'yourSchema'
luviktor

8
ini hebat - tetapi apakah mungkin untuk mengembalikannya untuk jenis kolom? yaitu varchar(255)bukannya varchardan int(11)bukannya int?
Don Cheadle

13
@mmcrae: Dimungkinkan menggunakan kolom CHARACTER_MAXIMUM_LENGTHdalam INFORMATION_SCHEMA.COLUMNS. Lakukan a SELECT * FROM INFORMATION_SCHEMA.COLUMNSuntuk melihat semua kolom yang tersedia.
Francis P

2
Bagaimana dengan tabel sementara?
Ilya Gazman

77

Cara termudah dalam TSQL adalah:

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

44

Untuk SQL Server, prosedur yang disimpan sistem ini akan mengembalikan semua informasi tabel, termasuk tipe data kolom:

exec sp_help YOURTABLENAME

5
Saya diputuskan karena hal ini walaupun bukan jawaban yang tepat tetapi memberikan informasi berharga kepada saya. Misalnya informasi "IsComputed" yang saya tidak temukan dalam skema Informasi tetapi saya dapat menemukan dalam kode prosedur sp_help dan salin dari sana.
Christoph

2
pilih nama tabel dan klik Alt+F1.. memberikan hasil yang sama.
Pugal

untuk memperjelas: tabel atau nama tampilan harus dipilih di editor dan kemudian tekan Alt+F1. Tidak dalam solusi Object Explorer. Ini adalah fitur yang sangat membantu
bugybunny

18

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

2
Sebenarnya itu JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id tidak unik. sys.columns doc
Fabricio

12

dalam oracle SQL Anda akan melakukan ini:

SELECT
    DATA_TYPE
FROM
    all_tab_columns 
WHERE
    table_name = 'TABLE NAME' -- in uppercase
AND column_name = 'COLUMN NAME' -- in uppercase

9

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

1
Dengan sebaliknya Anda maksudkan RDBMS lain selain dari MySQL?
Lamak

2
Iya. The DESCRIBEsintaks berlaku di Oracle juga, namun MSSQL tidak akan menerima sintaks ini.
fimas

Lihat jawaban dari @jTC untuk metode pada MSSQL dan TSQL.
fimas

Versi MySQL yang lebih baru information_schema.COLUMNS.
Rick James

Saya menemukan DESC atau DESCRIBE (tergantung pada DBMS yang Anda gunakan) berguna untuk tabel kecil dengan 3 atau 4 kolom kemudian itu menunjukkan struktur tabel dengan nama kolom Nullable flag dan tipe kolom untuk tabel besar namun butuh lebih banyak waktu untuk mengembalikan hasil dan itu lebih sulit untuk menemukan informasi yang Anda butuhkan.
kecepatan

7

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

4

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.


4

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'

1
Ini seharusnya jawaban yang diterima. Terima kasih, mungkin Anda dapat menambahkan kondisinya (t.type = 'U') - hapus tabel sistem
Iannick

Dan tipe VARBINARY dapat dengan mudah dipenuhi dengan menambahkannya ke WHENbaris pertama :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

Ini akan mengembalikan nilai-nilai Nama Kolom, menunjukkan kepada Anda nama-nama kolom, dan Tipe Data dari kolom tersebut (ints, varchars, dll).


3

Untuk IBM DB2 :

SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'

2

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

1

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


1

Menggunakan TSQL / MSSQL

Anda bisa menggunakan INTOkata kunci.

Hasil dari SELECTmenjadi TABEL nyata

Contoh: select .... INTO real_table_name

Setelah

sp_help real_table_name

1

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]

1
SHOW COLUMNS FROM //table_name// ;

Ini akan memberi Anda informasi tentang semua kolom dari tabel.



0

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

0

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

0

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


-1

Opsi lain untuk MS SQL adalah mengganti selectkueri 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);
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.