【问题标题】:SQL statement to get column type获取列类型的 SQL 语句
【发布时间】:2012-11-04 12:40:25
【问题描述】:

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

【问题讨论】:

  • 取决于 RDBMS;例如,SQL Server 有 sys.syscolumns 表。
  • 是的,但是会根据您使用的 RDBMS 类型而有所不同 - SQL 是一种语言,而不是数据库产品,这个问题取决于具体的产品。您将能够在 INFORMATION_SCHEMA.COLUMNS 表中找到此类信息 - 如果您的 RDBMS 有的话。

标签: sql schema


【解决方案1】:

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

【讨论】:

  • 其实是JOIN sys.types y ON y.user_type_id = c.user_type_id system_type_id 不是唯一的。 sys.columns doc
【解决方案2】:

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

SHOW COLUMNS FROM `tbl_name`;

SHOW COLUMNS on dev.mysql.com

否则你应该可以做到

DESCRIBE `tbl_name`;

【讨论】:

  • otherwise是指除了 MySQL 之外的其他 RDBMS?
  • 是的。 DESCRIBE 语法在 Oracle 中也有效,但是 MsSQL 不会接受这种语法。
  • 查看@jTC 的答案,了解有关 MSSQL 和 TSQL 的方法。
  • 较新版本的 MySQL 有information_schema.COLUMNS
  • 我发现 DESC 或 DESCRIBE(取决于您使用的 DBMS)对于具有 3 或 4 列的小表很有用,然后它显示具有列名 Nullable 标志和大表的列类型的表结构但是它需要返回结果的时间越长,就越难找到您需要的信息。
【解决方案3】:
USE [YourDatabaseName]
GO

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

这将返回值 Column Name,向您显示列的名称,以及这些列的数据类型(ints、varchars 等)。

【讨论】:

    【解决方案4】:

    使用 SQL Server:

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

    【讨论】:

    • 仅当您不想看到相应的列名时。这只会返回类型。如果您想查看该类型所属的列名,您还需要选择 COLUMN_NAME...
    • 如果您的表不在默认架构中,您可以使用 AND TABLE_SCHEMA = 'yourSchema' 扩展条件
    • 这很棒 - 但是否也可以让它返回列类型的范围?即varchar(255)而不是varcharint(11)而不是int
    • @mmcrae :可以在INFORMATION_SCHEMA.COLUMNS 中使用CHARACTER_MAXIMUM_LENGTH 列。只需发送SELECT * FROM INFORMATION_SCHEMA.COLUMNS 即可查看所有可用列。
    • 临时表呢?
    【解决方案5】:

    TSQL 中最简单的方法是:

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

    【讨论】:

      【解决方案6】:

      对于 IBM DB2

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

      【讨论】:

        【解决方案7】:

        在 oracle SQL 中你会这样做:

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

        【讨论】:

          【解决方案8】:

          在我的情况下,我需要获取 Dynamic SQL 的数据类型(颤抖!)无论如何,这是我创建的一个返回完整数据类型的函数。例如,它不会返回“十进制”,而是返回 DECIMAL(18,4):dbo.GetLiteralDataType

          【讨论】:

            【解决方案9】:

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

            exec sp_help YOURTABLENAME
            

            【讨论】:

            • 我投了赞成票,因为这虽然不完全是答案,但为我提供了有价值的信息。例如。我在信息模式中没有找到的“IsComputed”信息,但我可以在 sp_help 过程代码中找到并从那里复制。
            • 选择表名并点击Alt+F1.. 得到相同的结果。
            • 澄清:必须在编辑器中选择表或视图名称,然后按Alt+F1。不在解决方案对象资源管理器中。这是一个非常有用的功能
            • 不仅是表,在视图上也可以正常工作,只是: 1. 在 SSMS 中连接到 SQL Server 2. 打开新查询窗口 3. 选择您的数据库:使用 4. 运行命令: exec sp_help
            【解决方案10】:

            使用 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。

            【讨论】:

              【解决方案11】:

              使用 TSQL/MSSQL

              你可以使用INTO关键字。

              SELECT 的结果变成了一个真实的 TABLE

              例如:select .... INTO real_table_name

              之后

              sp_help real_table_name
              

              【讨论】:

                【解决方案12】:

                使用此查询获取 Schema、Table、Column、Type、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]
                

                【讨论】:

                  【解决方案13】:

                  使用 MS SQL 的另一种变体:

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

                  【讨论】:

                    【解决方案14】:

                    对于Spark SQL

                    DESCRIBE [db_name.]table_name column_name
                    

                    【讨论】:

                      【解决方案15】:

                      对于Apache Derbythis answer所示:

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

                      【讨论】:

                        【解决方案16】:
                        SHOW COLUMNS FROM //table_name// ;
                        

                        它将为您提供有关表中所有列的信息。

                        【讨论】:

                          【解决方案17】:

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

                          【讨论】:

                            【解决方案18】:

                            要检索实际声明的数据类型,例如用于动态 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
                            

                            【讨论】:

                              【解决方案19】:

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

                              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

                              【讨论】:

                                【解决方案20】:

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

                                【讨论】:

                                  【解决方案21】:

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

                                  例如,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'
                                  

                                  【讨论】:

                                  • 这应该是公认的答案。谢谢,也许您可​​以添加条件( t.type = 'U' )--删除系统表
                                  • 而 VARBINARY 类型可以通过将其添加到第一行 WHEN 来轻松满足:WHEN tp.[name] IN ('varchar', 'char', 'varbinary') THEN...
                                  【解决方案22】:

                                  使用这个查询

                                  SELECT * FROM INFORMATION_SCHEMA.COLUMNS
                                  WHERE TABLE_NAME = 'TABLE_NAME'
                                  ORDER BY ORDINAL_POSITION
                                  

                                  【讨论】:

                                    【解决方案23】:

                                    我发现这对查询很有用,尤其是当它们使用聚合或多个表 (SQL Server) 时

                                    DECLARE @query nvarchar(max) = 'select * from yourtable';
                                    EXEC sp_describe_first_result_set @query, null, 0; 
                                    

                                    【讨论】:

                                      【解决方案24】:

                                      这也适用,因为它只选择列名及其各自的字符类型

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

                                      【讨论】:

                                        【解决方案25】:

                                        从 SQL Server 2012 开始:

                                        SELECT * FROM sys.dm_exec_describe_first_result_set( N'SELECT * FROM [my].[Table]', NULL, 0 );
                                        

                                        【讨论】:

                                          【解决方案26】:

                                          如果有人觉得这很有用。在 SQL Server 中:

                                                sp_columns 'yourtablename'
                                          

                                          这将提供所有列的详细信息。它为您提供 column_name、data_type、type_name、precision、length、iss_nullable 等。

                                          【讨论】:

                                            猜你喜欢
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2016-09-16
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 1970-01-01
                                            • 2016-02-05
                                            • 1970-01-01
                                            • 1970-01-01
                                            相关资源
                                            最近更新 更多