0

鉴于此表:

在此处输入图像描述

这个查询:

SELECT TABLE_NAME, COLUMN_NAME, DATA_TYPE, CHARACTER_MAXIMUM_LENGTH,
  NUMERIC_PRECISION, IS_NULLABLE
FROM
  INFORMATION_SCHEMA.COLUMNS 
WHERE
  TABLE_NAME='PARAMETERS'
ORDER BY TABLE_NAME, ORDINAL_POSITION

我得到这个结果:

在此处输入图像描述

如何检索整数列的大小?对于PAR_ID(长度 = 2),我得到NUMERIC_PRECISION5 分。

的定义NUMERIC_PRECISION是“近似数值数据、精确数值数据、整数数据或货币数据的精度。否则,返回 NULL”。但是为什么 smallint(2) 的值为 5,例如 float(8) 的值为 53?这个值是什么意思?

更新:

感谢@Ed_Harper:长度和精度之间存在差异。长度是用于存储数字的字节数。精度是数字中的位数。见:http: //goo.gl/EOTyC

4

3 回答 3

0

对于 SQL 2000,试试这个(未经测试):

SELECT c.name AS ColumnName, TYPE_NAME(c.xusertype) AS DataType, 
    c.length, c.PREC, c.scale
FROM sysobjects t
    JOIN syscolumns c ON t.id = c.id
WHERE t.name = 'PARAMETERS'

从 SQL 2005+ 尝试:

尝试 sys.columns 代替...

SELECT c.name AS ColumnName, ty.name AS DataType, c.max_length, 
    c.precision, c.scale
FROM sys.tables t
    JOIN sys.columns c ON t.object_id = c.object_id
    JOIN sys.types ty ON c.system_type_id = ty.system_type_id
WHERE t.name = 'PARAMETERS'
于 2012-10-04T13:32:19.713 回答
0

试试这个:

SELECT c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, c.CHARACTER_MAXIMUM_LENGTH,
  c.NUMERIC_PRECISION, c.IS_NULLABLE,sc.max_length
FROM
  INFORMATION_SCHEMA.COLUMNS c inner join sys.columns sc
  on c.TABLE_NAME=object_name(sc.object_id)
WHERE
  c.TABLE_NAME='PARAMETERS'
ORDER BY TABLE_NAME, ORDINAL_POSITION

SQL 服务器 2000

  SELECT distinct c.TABLE_NAME, c.COLUMN_NAME, c.DATA_TYPE, c.CHARACTER_MAXIMUM_LENGTH,
  c.NUMERIC_PRECISION, c.IS_NULLABLE,sc.length
FROM
  INFORMATION_SCHEMA.COLUMNS c inner join syscolumns sc

  on c.TABLE_NAME=object_name(sc.id)
WHERE
  c.TABLE_NAME='PARAMETERS'
于 2012-10-04T13:33:59.043 回答
0

int 系列成员的存储大小是固定的,如此所述(链接适用于 SQL 2012,但自 SQL 2000 以来没有改变):

tinyint  = 1 byte
smallint = 2 bytes
int      = 4 bytes
bigint   = 8 bytes

将此信息输入查询的最简单方法是将其硬编码在 case 语句中。

NUMERIC_PRECISION- 确定可以存储在数字数据类型中的小数位数的总数。这个值是 5 smallint, 10int等等,因为这是每个数据类型可以存储的最长的数字序列。

编辑

显示使用 case 语句的示例查询。请注意,数据类型列表不完整。

SELECT TABLE_NAME, COLUMN_NAME, CHARACTER_MAXIMUM_LENGTH,
  NUMERIC_PRECISION, IS_NULLABLE,DATA_TYPE,
  CASE DATA_TYPE WHEN  'tinyint'  THEN 1
                 WHEN  'smallint' THEN 2
                 WHEN  'int'      THEN 4
                 WHEN  'bigint'   THEN 8
                 WHEN  'datetime' THEN 8
                 WHEN  'nvarchar' THEN CHARACTER_MAXIMUM_LENGTH * 2
                 WHEN  'nchar'    THEN CHARACTER_MAXIMUM_LENGTH * 2
                 WHEN  'varchar'  THEN CHARACTER_MAXIMUM_LENGTH
                 WHEN  'char'     THEN CHARACTER_MAXIMUM_LENGTH
                 ELSE  NULL
  END AS column_size_bytes
FROM
  INFORMATION_SCHEMA.COLUMNS 
  order by data_type
于 2012-10-09T08:18:04.877 回答