连接3个表时,SQL Server会引发算术错误

时间:2018-01-31 23:10:49

标签: sql-server sql-server-2005

当我尝试加入3个系统表时,出现错误:

  

将数字转换为数据类型数字

的算术溢出错误

但是如果我试图只加入其中的两个,那就可以了。

为什么呢?

代码1 :(不起作用)

SELECT 
    database_id = (D.database_id),
    last_user_lookup = MAX(U.last_user_seek),
    last_user_update = MAX(U.last_user_seek),
    total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2)),
    create_date = MAX(D.create_date)
FROM 
    sys.databases D
JOIN 
    sys.dm_db_index_usage_stats U ON (D.database_id = U.database_id)
JOIN 
    sys.master_files F ON (D.database_id = F.database_id)
GROUP BY 
    D.database_id;

代码2 :(确实有效)

SELECT 
    database_id = (D.database_id),
    -- last_user_lookup = MAX(U.last_user_seek),
    -- last_user_update = MAX(U.last_user_seek),
    total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2)),
    create_date = MAX(D.create_date)
FROM 
    sys.databases D
-- JOIN 
--    sys.dm_db_index_usage_stats U ON (D.database_id = U.database_id)
JOIN 
    sys.master_files F ON (D.database_id = F.database_id)
GROUP BY 
    D.database_id;

代码3 :(也有效)

SELECT 
    database_id = (D.database_id),
    last_user_lookup = MAX(U.last_user_seek),
    last_user_update = MAX(U.last_user_seek),
    -- total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2)),
    create_date = MAX(D.create_date)
FROM 
    sys.databases D
JOIN 
    sys.dm_db_index_usage_stats U ON (D.database_id = U.database_id)
-- JOIN 
--     sys.master_files F ON (D.database_id = F.database_id)
GROUP BY D.database_id;

1 个答案:

答案 0 :(得分:2)

如果你试图在太少的空格中输入过多的数字,则抛出arithmetic overflow error converting numeric to data type numeric

您有8个数字,包含2位小数:xxxxxx.xx

对于2个表格,total_size_mb = CAST(SUM(size) * 8. / 1024 AS DECIMAL(8,2)).之前不超过6个位置 - 有3个表格,总和超过此值且无法再将其放入其中。

将其增加到DECIMAL(9,2)然后DECIMAL(10,2)再增加DECIMAL(11,2)直到它适合 - 或者分析您的数据字段的广度。