2012-10-04 25 views
0

對於這個表:檢索大小整數值的SQL Server表INFORMATION_SCHEMA.COLUMNS視圖

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一個NUMERIC_PRECISION 5.

的定義是「近似數值數據,精確數字數據,整數數據或貨幣數據的精度。否則,返回NULL」。但爲什麼smallint(2)的值爲5,而float(8)的值爲53?這是什麼意思?

UPDATE:

感謝@Ed_Harper:有長度和精度之間的差異。長度是用於存儲數字的字節數。精度是一個數字中的位數。請參閱:http://goo.gl/EOTyC

回答

0

整型家庭成員的存儲大小是固定的,如記錄here(鏈接是SQL 2012,但這既然SQL 2000沒有改變):

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

將這些信息放入查詢的最簡單方法是在case語句中對其進行硬編碼。

NUMERIC_PRECISION - 確定可以存儲在數字數據類型中的小數位總數。對於smallint,這個值是5,對於int等等,因爲這是每個數據類型可以存儲的最長數字序列。

編輯

樣品查詢表示將使用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 
+0

謝謝,我現在看到有是長度和精度之間的差異。我會更新我的問題 – waanders

+0

儘管我仍然不知道如何查詢我的數字表列的長度 – waanders

+0

@waanders - 添加了一個示例case語句 –

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' 
+0

但我想使用INFORMATION_SCHEMA.COLUMNS。並想知道整數列的大小/長度值是什麼意思 – waanders

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' 
+0

嘗試更新的一個 – AnandPhadke

+0

我得到重複的行:64行,我只有8列 – waanders

+0

只是試試這個查詢運行,看看你得到多少結果 - 「SELECT具有鮮明的PLS * FROM syscolumns中 其中id = OBJECT_ID(「參數」)」 – AnandPhadke