Sütun türünü almak için SQL deyimi


302

Tablodaki bir sütunun türünü döndürebilen bir SQL ifadesi var mı?


5
RDBMS'ye bağlıdır; SQL Server'da sys.syscolumnstablo var.
LittleBobbyTables - Au Revoir

3
Evet, ancak ne tür RDBMS kullandığınıza bağlı olarak farklı olacaktır - SQL veritabanı ürünü değil, bir dildir ve bu soru belirli bir ürüne dayanır. INFORMATION_SCHEMA.COLUMNSRDBMS'niz varsa, bu tür bilgileri tabloda bulabilirsiniz .
Köprü

Yanıtlar:


461

SQL Server'ı kullanma:

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

11
Yalnızca ilgili sütun adını görmek istemiyorsanız. Bu yalnızca türleri döndürür.
Türün

5
Tablonuz varsayılan şemada değilse, durumu şu şekilde uzatabilirsinizAND TABLE_SCHEMA = 'yourSchema'
luviktor

8
bu harika - ama aynı zamanda sütun türü için aralığı döndürmek mümkün mü? yani varchar(255)yerine varcharve int(11)yerine int?
Don Cheadle

13
@mmcrae: CHARACTER_MAXIMUM_LENGTHiçindeki sütun kullanılarak mümkündür INFORMATION_SCHEMA.COLUMNS. SELECT * FROM INFORMATION_SCHEMA.COLUMNSMevcut tüm sütunları görmek için sadece bir yap .
Francis P

2
Geçici tablolar ne olacak?
Ilya Gazman

77

TSQL'de en kolay yol:

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

44

SQL Server için, bu sistem saklı yordamı sütun veri türleri dahil tüm tablo bilgilerini döndürür:

exec sp_help YOURTABLENAME

5
Her ne kadar tam olarak cevap olmasa da bana değerli bilgiler verdiğinden, bu konuda destek verdim. Örneğin, Bilgi şemasında bulamadığım "IsComputed" bilgileri ancak sp_help yordam kodunda bulabilir ve oradan kopyalayabilirim.
Christoph

2
tablo adını seçin ve tıklayın Alt+F1.. aynı sonucu verir.
Pugal

Açıklığa kavuşturmak için: düzenleyicide tablo veya görünüm adının seçilmesi ve ardından düğmesine basın Alt+F1. Çözüm Object Explorer'da değil. Bu yararlı bir özellik
bugybunny

18

TSQL / MSSQL'de şöyle görünür:

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
Aslında JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id benzersiz değildir. sys.columns doc
Fabricio

12

oracle SQL'de bunu yapardınız:

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

9

MySQL kullanıyorsanız deneyebilirsiniz

SHOW COLUMNS FROM `tbl_name`;

Dev.mysql.com üzerinde KOLONLARI GÖSTER

Aksi takdirde,

DESCRIBE `tbl_name`;

1
İle aksi diğer RDBMS'yi ayrı MySQL dan demek?
Lamak

2
Evet. DESCRIBESözdizimi ancak MsSQL bu sözdizimini kabul etmeyecektir yanı Oracle geçerlidir.
fimas

MSSQL ve TSQL yöntemi için @jTC yanıtına bakın.
fimas

MySQL'in daha yeni sürümleri var information_schema.COLUMNS.
Rick James

DESC VEYA DESCRIBE'i (kullandığınız DBMS'ye bağlı olarak) 3 veya 4 sütunlu küçük tablolar için yararlı buluyorum, sonra büyük tablolar için sütun adı Nullable bayrağı ve sütun türü içeren tablo yapısını gösterir, ancak bir sonuç döndürmek için daha fazla zaman alır ve ihtiyacınız olan bilgiyi bulmak daha zordur.
hız

7

MS SQL kullanan başka bir varyasyon:

SELECT TYPE_NAME(system_type_id) 
FROM sys.columns 
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');

4

TSQL / MSSQL Kullanımı

Bu sorgu size şunları sağlar: tablo adı, sütun adı, veri türü, veri türü uzunluğu ve izin verilen boş değerler

SELECT TABLE_NAME,COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'your_table_name'

Değiştirilmesi gereken tek şey tablonuz_adı.


4

Yukarıdaki yanıtlara dayanmak için, sütun veri türünü sütunları bildirmeniz gereken formatta elde etmek genellikle yararlıdır.

Örneğin varchar(50), varchar(max), decimal(p, s).

Bu, bunu yapmanızı sağlar:

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
Bu kabul edilen cevap olmalıydı. Teşekkürler, belki koşulu ekleyebilirsiniz (t.type = 'U') - sistem tablosunu kaldır
Iannick

Ve VARBINARY tipleri ilk WHENsatıra eklenerek kolayca ikram edilebilir :WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
Tersine Mühendis

3
USE [YourDatabaseName]
GO

SELECT column_name 'Column Name',
data_type 'Data Type'
FROM information_schema.columns
WHERE table_name = 'YourTableName'
GO

Bu, size sütun adlarını ve bu sütunların Veri Türlerini (ints, varchars, vb.) Gösteren Sütun Adı değerlerini döndürür.


3

İçin IBM DB2 :

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

2

Bildirilen gerçek veri türlerini almak için, örneğin dinamik SQL'den ALTER COLUMN'lara kullanmak için, bunun gibi bir şey kullanılabilir:

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

Benim durumumda Dinamik SQL (Shudder!) İçin veri türünü almam gerekiyordu, yine de burada oluşturduğum, tam veri türünü döndüren bir işlev. Örneğin, 'ondalık' değerini döndürmek yerine DECIMAL (18,4) döndürür: dbo.GetLiteralDataType


1

TSQL / MSSQL Kullanımı

INTOAnahtar kelime kullanabilirsiniz .

SELECTGerçek bir TABLO sonucu

Misal: select .... INTO real_table_name

Sonra

sp_help real_table_name

1

Şema, Tablo, Sütun, Tür, max_length, is_nullable değerini almak için bu sorguyu kullanın

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

Tablodaki tüm sütunlar hakkında bilgi verecektir.



0

İçin Apache Derby gösterildiği gibi bu cevap :

select columndatatype from sys.syscolumns
  where referenceid = (
    select tableid from sys.systables
    where tablename = 'YOUR_TABEL_NAME'
    and columnname= 'YOUR_COLUMN_NAME')

0

Vb60'ta bunu yapabilirsiniz:

Public Cn As ADODB.Connection
'open connection
Dim Rs As ADODB.Recordset
 Set Rs = Cn.OpenSchema(adSchemaColumns, Array(Empty, Empty, UCase("Table"), UCase("field")))

've sample (valRs benim işlevim rs.fields ("CHARACTER_MAXIMUM_LENGTH"). değer):

 RT_Charactar_Maximum_Length = (ValRS(Rs, "CHARACTER_MAXIMUM_LENGTH"))
        rt_Tipo = (ValRS(Rs, "DATA_TYPE"))

0

Bazı insanlar veri türüyle de hassaslık istediğinden, böyle bir amaçla oluşturduğum senaryomu paylaşmak istiyorum.

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'

Mükemmel değil ama çoğu durumda çalışır.

kullanma Sql-Server


-1

MS SQL için başka bir seçenek selectde buradaki sorguyu, türleri için istediğiniz sorguyla değiştirmektir :

declare @sql varchar(4000);

set @sql = 'select ''hi'' as greeting';

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.