SQL语句获取列类型


301

是否存在可以返回表中列类型的SQL语句?


5
取决于RDBMS;sys.syscolumns例如,SQL Server有该表。
LittleBobbyTables-Au Revoir,2012年

3
是的,但是根据您使用的RDBMS类型的不同,它会有所不同-SQL是一种语言,而不是数据库产品,这个问题取决于特定的产品。INFORMATION_SCHEMA.COLUMNS如果您的RDBMS有此信息,则可以在表中找到此类信息。
桥接

Answers:


460

使用SQL Server:

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

11
仅当您不想看到相应的列名时。这只会返回类型。如果要查看类型所属的列名称,则还需要选择COLUMN_NAME ...
HackyStack

5
而且,如果您的表不在默认模式下,则可以使用AND TABLE_SCHEMA = 'yourSchema'
luviktor 2015年

8
这很好-但是是否也可以让它返回列类型的范围?即varchar(255)代替varcharint(11)代替int
Don Cheadle 2015年

13
@mmcrae:它使用的列可能 CHARACTER_MAXIMUM_LENGTHINFORMATION_SCHEMA.COLUMNS。只需执行一次SELECT * FROM INFORMATION_SCHEMA.COLUMNS即可查看所有可用列。
弗朗西斯·P

2
临时表呢?
伊利亚·加兹曼

77

TSQL中最简单的方法是:

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

44

对于SQL Server,此系统存储过程将返回所有表信息,包括列数据类型:

exec sp_help YOURTABLENAME

5
我支持,因为这虽然不是确切的答案,但可以为我提供有价值的信息。例如,我在信息模式中找不到的“ IsComputed”信息,但可以在sp_help过程代码中找到并从那里复制。
Christoph

2
选择表名称,然后单击Alt+F1..将得到相同的结果。
Pugal

进行说明:必须在编辑器中选择表或视图名称,然后按Alt+F1。解决方案中没有对象浏览器。这是一个有用的功能
bugybunny

18

在TSQL / MSSQL中,它看起来像:

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
实际上它是JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id不是唯一的。sys.columns doc
Fabricio

12

在oracle SQL中,您可以这样做:

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

9

如果您使用的是MySQL,则可以尝试

SHOW COLUMNS FROM `tbl_name`;

在dev.mysql.com上显示列

否则你应该能够做

DESCRIBE `tbl_name`;

1
随着否则你的意思是其他RDBMS除了MySQL的?
拉马克2012年

2
是。该DESCRIBE语法在Oracle中也有效,但是MsSQL将不接受此语法。
fimas 2012年

有关MSSQL和TSQL的方法,请参见@jTC的答案。
fimas 2012年

较新的MySQL版本具有information_schema.COLUMNS
里克·詹姆斯

我发现DESC或DESCRIBE(取决于您使用的DBMS)对于具有3或4列的小型表很有用,然后它显示具有大型表的列名称为Nullable标志和列类型的表结构,但是返回结果要花费更多时间,并且很难找到您需要的信息。
速度

7

使用MS SQL的另一个变体:

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

4

使用TSQL / MSSQL

该查询将为您提供:表名称,列名称,数据类型,数据类型长度和允许的空值

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

唯一需要更改的是your_table_name。


4

为了建立以上答案,通常以与声明列相同的格式获取列数据类型通常很有用。

例如varchar(50)varchar(max)decimal(p, s)

这使您可以执行以下操作:

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
这应该是公认的答案。谢谢,也许您可​​以添加条件(t.type ='U')-删除系统表
Iannick

3
USE [YourDatabaseName]
GO

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

这将返回“列名”值,向您显示列名以及这些列的数据类型(int,varchars等)。


3

对于IBM DB2

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

2

要检索实际声明的数据类型(例如,在动态SQL中使用以更改COLUMN),可以使用如下所示的内容:

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

就我而言,无论如何,我都需要获取Dynamic SQL的数据类型(Shudder!),这是我创建的返回完整数据类型的函数。例如,不是返回“十进制”,而是返回DECIMAL(18,4):dbo.GetLiteralDataType


1

使用TSQL / MSSQL

您可以使用INTO关键字。

SELECT转换成真实表的结果

例: select .... INTO real_table_name

sp_help real_table_name

1

使用此查询获取架构,表,列,类型,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]



0

对于Apache Derby,如以下答案所示:

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

0

在vb60中,您可以执行以下操作:

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

'和样本(valRs是我对rs.fields(“ CHARACTER_MAXIMUM_LENGTH”)。value的函数):

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

0

由于有些人也在要求数据类型的精度,所以我想分享我为此目的创建的脚本。

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'

它并不完美,但在大多数情况下都可以使用。

使用 Sql-Server


-1

MS SQL的另一种选择是将select此处的查询替换为您想要的类型的查询:

declare @sql varchar(4000);

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

select * from master.sys.dm_exec_describe_first_result_set (@sql, Null, 0);
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.