使用INFORMATION_SCHEMA.COLUMNS视图检索大小整数值SQL Server表

时间:2012-10-04 13:21:50

标签: sql-server sql-server-2000

鉴于此表:

enter image description here

和这个查询:

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

我得到了这个结果:

enter image description here

如何检索整数列的大小?对于PAR_ID(Lenght = 2),我得到NUMERIC_PRECISION为5。

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

更新:

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

3 个答案:

答案 0 :(得分: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'

答案 1 :(得分: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 server 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'

答案 2 :(得分:0)

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

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

将此信息输入查询的最简单方法是在案例陈述中对其进行硬编码。

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

修改

示例查询显示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