获取列类型的SQL语句

问题描述 投票:0回答:30

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

sql schema
30个回答
651
投票
  • 在 ISO SQL(即当今的大多数 RDBMS)中,您可以使用
    INFORMATION_SCHEMA.COLUMNS
    视图,SQL Server 支持
    • 此视图的
      DATA_TYPE
      列包含 T-SQL/SQL Server 类型名称,除了包含参数化类型的参数,这可能会导致意外/无意的列行为。
      • 例如,给定输入为
        nvarchar(max)
        datetime2(3)
        decimal(10,5)
        的三列,则输出将分别为
        nvarchar
        datetime2
        decimal
        • 这是一个问题,因为键入为
          nvarchar
          (没有
          (max)
          (123)
          的列与
          nvarchar(1)
          相同,并且使用
          decimal
          decimal(18,0)
          相同,无法存储非-整数值
      • 解决方案是查看
        CHARACTER_OCTET_LENGTH
        (对于
        binary
        )、
        CHARACTER_MAXIMUM_LENGTH
        (对于
        char
        nchar
        )、
        DATETIME_PRECISION
        (对于
        datetime2
        datetimeoffset
        )和
         NUMERIC_PRECISION
        NUMERIC_SCALE
        (对于
        decimal
        numeric
        )以便重建类型的参数值。
        • 请注意,可以忽略
          float(n)
          ,因为 SQL Server 仅支持
          float(24)
          float(53)
          ,它们在
          real
          列中分别由
          float
          DATA_TYPE
          别名。

WITH q AS (
    
    SELECT
        c.TABLE_SCHEMA,
        c.TABLE_NAME,
        c.ORDINAL_POSITION,
        c.COLUMN_NAME,
        c.DATA_TYPE,
        CASE
            WHEN c.DATA_TYPE IN ( N'binary', N'varbinary'                    ) THEN ( CASE c.CHARACTER_OCTET_LENGTH   WHEN -1 THEN N'(max)' ELSE CONCAT( N'(', c.CHARACTER_OCTET_LENGTH  , N')' ) END )
            WHEN c.DATA_TYPE IN ( N'char', N'varchar', N'nchar', N'nvarchar' ) THEN ( CASE c.CHARACTER_MAXIMUM_LENGTH WHEN -1 THEN N'(max)' ELSE CONCAT( N'(', c.CHARACTER_MAXIMUM_LENGTH, N')' ) END )
            WHEN c.DATA_TYPE IN ( N'datetime2', N'datetimeoffset'            ) THEN CONCAT( N'(', c.DATETIME_PRECISION, N')' )
            WHEN c.DATA_TYPE IN ( N'decimal', N'numeric'                     ) THEN CONCAT( N'(', c.NUMERIC_PRECISION , N',', c.NUMERIC_SCALE, N')' )
        END AS DATA_TYPE_PARAMETER,
        CASE c.IS_NULLABLE
            WHEN N'NO'  THEN N' NOT NULL'
            WHEN N'YES' THEN     N' NULL'
        END AS IS_NULLABLE2
    FROM
        INFORMATION_SCHEMA.COLUMNS AS c
)
SELECT
    q.TABLE_SCHEMA,
    q.TABLE_NAME,
    q.ORDINAL_POSITION,
    q.COLUMN_NAME,
    CONCAT( q.DATA_TYPE, ISNULL( q.DATA_TYPE_PARAMETER, N'' ), q.IS_NULLABLE2 ) AS FULL_DATA_TYPE

FROM
    q
WHERE
    q.TABLE_SCHEMA = 'yourSchemaName' AND
    q.TABLE_NAME   = 'yourTableName'  AND 
    q.COLUMN_NAME  = 'yourColumnName'

ORDER BY
    q.TABLE_SCHEMA,
    q.TABLE_NAME,
    q.ORDINAL_POSITION;

给出这样的结果:


143
投票

TSQL 中最简单的方法是:

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

66
投票

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

exec sp_help YOURTABLENAME

29
投票

如果你使用 MySQL 你可以尝试

SHOW COLUMNS FROM `tbl_name`;

在 dev.mysql.com 上显示列

否则你应该能够做到

DESCRIBE `tbl_name`;

28
投票

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

24
投票

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

例如,

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

这可以让你做到这一点:

SELECT 
  [Name]         = c.[name]
, [Type]         = 
    CASE 
      WHEN tp.[name] IN ('varchar', 'char', 'varbinary') 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
, [IsNullable]   = c.is_nullable
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'

17
投票

在 Oracle SQL 中你会这样做:

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

11
投票

使用 MS SQL 的另一种变体:

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

9
投票

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


9
投票

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

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

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

5
投票

从 SQL Server 2012 开始:

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

5
投票

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

sp_columns 'yourtablename'

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


4
投票
USE [YourDatabaseName]
GO

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

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


4
投票

对于 IBM DB2

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

4
投票

使用TSQL/MSSQL

您可以使用

INTO
关键字。

SELECT
的结果转化为真实的TABLE

示例:

select .... INTO real_table_name

之后

sp_help real_table_name

4
投票

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

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


4
投票

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

3
投票

使用此查询

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

3
投票

下面的 SQL 脚本在我这里完美运行。

SELECT column_name AS 'Column Name',data_type AS 'Data Type' 
FROM information_schema.columns 
WHERE table_name = '[Table Name]'

2
投票

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


2
投票

使用此查询获取 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]

2
投票
SHOW COLUMNS FROM //table_name// ;

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


2
投票

我认为Microsoft SQL Server Management Studio中最简单、最有用的方法:

EXEC [ServerName].[DatabaseName].dbo.sp_help 'TableName'

2
投票

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

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

1
投票

对于 Spark SQL

DESCRIBE [db_name.]table_name column_name

1
投票

对于Apache Derby,如此答案所示:

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

1
投票

在 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
投票

只需这样做

describe table test.oim_test_2

您将获得所有列及其数据类型的详细信息


0
投票

可以使用下面的脚本来获得相同的结果:

SELECT column_name 'Column_Name', data_type 'Data_Type' 
FROM information_schema.columns
WHERE table_name = 'Name of your desired table'

注意: 它不会返回您为 varchar/nvarchar 类型列指定的大小

如果想获取有关表格的完整详细信息,可以使用以下脚本:

EXEC [Your Database Name].dbo.sp_help 'Your Table Name'
© www.soinside.com 2019 - 2024. All rights reserved.