获取列类型的SQL语句

dan*_*ely 262 sql schema

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

Fra*_*s P 403

使用SQL Server:

SELECT DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS
WHERE 
     TABLE_NAME = 'yourTableName' AND 
     COLUMN_NAME = 'yourColumnName'
Run Code Online (Sandbox Code Playgroud)

  • @mmcrae:可以在`INFORMATION_SCHEMA.COLUMNS`中使用列`CHARACTER_MAXIMUM_LENGTH`.只需执行`SELECT*FROM INFORMATION_SCHEMA.COLUMNS`即可查看所有可用列. (12认同)
  • 仅当您不希望看到相应的列名称时.这只会返回类型.如果要查看类型所属的列名称,还需要选择COLUMN_NAME ... (10认同)
  • 这很棒 - 但它是否可以让它返回列类型的范围?即`varchar(255)`而不是`varchar`和`int(11)`而不是`int`? (8认同)
  • 如果你的表不在默认模式中,你可以使用`AND TABLE_SCHEMA ='yourSchema'扩展条件. (4认同)
  • 查看完整可读的列类型(如“numeric(10, 2)”或“varchar(100)”)会很有用 (3认同)
  • 您只需使用视图名称而不是表名称即可在视图上使用它。在我想到这一点之前,我几乎忽略了这个答案的观点。 (3认同)
  • 临时表呢? (2认同)
  • @Ilya_Gazman 在什么情况下您需要识别临时表列的类型? (2认同)

Hac*_*ack 65

TSQL中最简单的方法是:

SELECT COLUMN_NAME, DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'yourTableName'
Run Code Online (Sandbox Code Playgroud)


小智 37

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

exec sp_help YOURTABLENAME
Run Code Online (Sandbox Code Playgroud)

  • 我赞成,因为这虽然不是答案,但为我提供了有价值的信息.例如,我在信息模式中找不到"IsComputed"信息,但我可以在sp_help过程代码中找到并从那里复制. (5认同)
  • 澄清一下:必须在编辑器中选择表或视图名称,然后按“Alt+F1”。不在解决方案对象资源管理器中。这是一个非常有用的功能 (4认同)
  • 选择表名称,然后单击“ Alt + F1”。 (2认同)

jTC*_*jTC 14

在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 = ''
Run Code Online (Sandbox Code Playgroud)

  • 实际上是`JOIN sys.types y ON y.user_type_id = c.user_type_id` system_type_id不是唯一的。[sys.columns doc](https://docs.microsoft.com/zh-cn/sql/relational-databases/system-catalog-views/sys-columns-transact-sql?view=sql-server-2017) (2认同)

Ass*_*saf 12

在oracle SQL中你会这样做:

SELECT
    DATA_TYPE
FROM
    all_tab_columns 
WHERE
    table_name = 'TABLE NAME' -- in uppercase
AND column_name = 'COLUMN NAME' -- in uppercase
Run Code Online (Sandbox Code Playgroud)


fim*_*mas 9

如果你使用MySQL,你可以试试

SHOW COLUMNS FROM `tbl_name`;
Run Code Online (Sandbox Code Playgroud)

在dev.mysql.com上显示列

否则你应该可以做到

DESCRIBE `tbl_name`;
Run Code Online (Sandbox Code Playgroud)

  • “否则”是指除 MySQL 之外的其他 RDBMS 吗? (2认同)
  • 是."DESCRIBE"语法在Oracle中也是有效的,但是MsSQL不接受这种语法. (2认同)

MgS*_*Sam 9

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

例如,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'
Run Code Online (Sandbox Code Playgroud)

  • 这应该是公认的答案。谢谢,也许你可以添加条件( t.type = 'U' )--删除系统表 (5认同)
  • 并且可以通过将其添加到第一行“WHEN”来轻松满足 VARBINARY 类型:“WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...” (2认同)
  • 最好的答案,我还会在“c.scale”之后添加:“, [IsNullable] = c.is_nullable”。我认为这非常有用。 (2认同)

小智 9

这也有效,因为它仅选择列名称及其各自的字符类型

SELECT COLUMN_NAME ,DATA_TYPE 
FROM INFORMATION_SCHEMA.COLUMNS 
WHERE TABLE_NAME = 'Items';   
Run Code Online (Sandbox Code Playgroud)


cse*_*yam 7

使用 TSQL/MSSQL

此查询将获得:表名、列名、数据类型、数据类型长度和允许的空值

SELECT TABLE_NAME,COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH, IS_NULLABLE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'your_table_name'
Run Code Online (Sandbox Code Playgroud)

唯一需要更改的是your_table_name。


AjV*_*Jsy 7

要检索实际声明的数据类型,例如在动态 SQL 中用于 ALTER 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
Run Code Online (Sandbox Code Playgroud)


Arn*_*ekk 6

使用MS SQL的另一个变体:

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


小智 5

从 SQL Server 2012 开始:

SELECT * FROM sys.dm_exec_describe_first_result_set( N'SELECT * FROM [my].[Table]', NULL, 0 );
Run Code Online (Sandbox Code Playgroud)


Pal*_*ine 5

只要有人觉得这有用。在 SQL Server 中:

sp_columns 'yourtablename'
Run Code Online (Sandbox Code Playgroud)

这将提供所有列的详细信息。它为您提供列名称、数据类型、类型名称、精度、长度、iss_nullable 等。