SQL 服务器在连接 3 个表时抛出算术错误

SQL Server is throwing arithmetic error when joining 3 tables

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

Arithmetic overflow error converting numeric to data type numeric

但如果我只想加入其中的 2 个,它就可以正常工作。

为什么?

代码 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;

如果您尝试在太少的空格中输入太多数字,则会抛出 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) 直到它适合 - 或者分析你的数据字段必须有多宽。