在现代关系数据库管理系统(RDBMS)中,获取特定表的列类型信息是一个常见的需求。为了满足这一需求,ISO SQL 中广泛支持的 INFORMATION_SCHEMA.COLUMNS 视图提供了一种标准化机制来检索列元数据,包括其数据类型。
INFORMATION_SCHEMA.COLUMNS 视图中的 DATA_TYPE 列显示基本 T -SQL/SQL Server 类型名称,例如 nvarchar、datetime2 和decimal。但是,它不包括参数化类型的形参参数。此遗漏可能会导致意外的列行为。
为了缓解此问题,必须利用其他列,例如 CHARACTER_OCTET_LENGTH(对于二进制)、CHARACTER_MAXIMUM_LENGTH(对于 char 和 nchar)、DATETIME_PRECISION(对于 datetime2 和 datetimeoffset) 、NUMERIC_PRECISION 和 NUMERIC_SCALE (对于小数和数字)。通过组合这些值,您可以重建完整的类型,包括其参数。
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;
此查询生成包含完整数据类型的结果,包括参数信息和可为空性,如下所示:
[查询结果图片]
以上是如何在 SQL 中检索完整的列数据类型(包括参数和可为空性)?的详细内容。更多信息请关注PHP中文网其他相关文章!