有没有可以返回表中列的类型的SQL语句?
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;
给出这样的结果:
TSQL 中最简单的方法是:
SELECT COLUMN_NAME, DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'yourTableName'
对于 SQL Server,此系统存储过程将返回所有表信息,包括列数据类型:
exec sp_help YOURTABLENAME
在 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 = ''
为了构建上述答案,以与声明列所需的格式相同的格式获取列数据类型通常很有用。
例如,
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'
在 Oracle SQL 中你会这样做:
SELECT
DATA_TYPE
FROM
all_tab_columns
WHERE
table_name = 'TABLE NAME' -- in uppercase
AND column_name = 'COLUMN NAME' -- in uppercase
使用 MS SQL 的另一种变体:
SELECT TYPE_NAME(system_type_id)
FROM sys.columns
WHERE name = 'column_name'
AND [object_id] = OBJECT_ID('[dbo].[table_name]');
使用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。
这也有效,因为它仅选择列名称及其各自的字符类型
SELECT COLUMN_NAME ,DATA_TYPE
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'Items';
要检索实际声明的数据类型,例如在动态 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
从 SQL Server 2012 开始:
SELECT * FROM sys.dm_exec_describe_first_result_set( N'SELECT * FROM [my].[Table]', NULL, 0 );
如果有人觉得这有用。在 SQL Server 中:
sp_columns 'yourtablename'
这将提供所有列的详细信息。它为您提供列名称、数据类型、类型名称、精度、长度、iss_nullable 等。
USE [YourDatabaseName]
GO
SELECT column_name 'Column Name',
data_type 'Data Type'
FROM information_schema.columns
WHERE table_name = 'YourTableName'
GO
这将返回值“列名称”,向您显示列的名称以及这些列的数据类型(整数、varchar 等)。
对于 IBM DB2:
SELECT TYPENAME FROM SYSCAT.COLUMNS WHERE TABSCHEMA='your_schema_name' AND TABNAME='your_table_name' AND COLNAME='your_column_name'
使用TSQL/MSSQL
您可以使用
INTO
关键字。
将
SELECT
的结果转化为真实的TABLE
示例:
select .... INTO real_table_name
之后
sp_help real_table_name
由于有些人要求数据类型的精度,我想分享我为此目的创建的脚本。
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
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);
使用此查询
SELECT * FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_NAME = 'TABLE_NAME'
ORDER BY ORDINAL_POSITION
下面的 SQL 脚本在我这里完美运行。
SELECT column_name AS 'Column Name',data_type AS 'Data Type'
FROM information_schema.columns
WHERE table_name = '[Table Name]'
就我而言,我需要获取动态 SQL 的数据类型(颤抖!)无论如何,这是我创建的返回完整数据类型的函数。例如,它不会返回“十进制”,而是返回 DECIMAL(18,4): dbo.GetLiteralDataType
使用此查询获取 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]
SHOW COLUMNS FROM //table_name// ;
它将为您提供有关表中所有列的信息。
我认为Microsoft SQL Server Management Studio中最简单、最有用的方法:
EXEC [ServerName].[DatabaseName].dbo.sp_help 'TableName'
我发现这对于查询很有用,特别是当它们使用聚合或多个表(SQL Server)时
DECLARE @query nvarchar(max) = 'select * from yourtable';
EXEC sp_describe_first_result_set @query, null, 0;
对于 Spark SQL:
DESCRIBE [db_name.]table_name column_name
对于Apache Derby,如此答案所示:
select columndatatype from sys.syscolumns
where referenceid = (
select tableid from sys.systables
where tablename = 'YOUR_TABEL_NAME'
and columnname= 'YOUR_COLUMN_NAME')
在 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"))
只需这样做
describe table test.oim_test_2
您将获得所有列及其数据类型的详细信息
可以使用下面的脚本来获得相同的结果:
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'