我想获得此查询的结果,但我收到以下错误
将表达式转换为数据类型int的算术溢出错误
{{1}}
答案 0 :(得分:2)
尝试转换为bigint:
SELECT d.name,
ROUND(SUM(convert(bigint,mf.size)) * 8 / 1024, 0) Size_MBs
FROM sys.master_files mf
INNER JOIN sys.databases d ON d.database_id = mf.database_id
WHERE d.database_id > 4
GROUP BY d.name
ORDER BY d.name
答案 1 :(得分:1)
只需将8
替换为8.0
即可将结果转换为numeric数据类型。错误是因为
size
列为int
,8
也为int
,因此乘法结果为int
,但size
接近int type
上限2147483647你通过乘法溢出类型。
SELECT d.name,
ROUND(SUM(mf.size) * 8.0 / 1024, 0) Size_MBs
FROM sys.master_files mf
INNER JOIN sys.databases d ON d.database_id = mf.database_id
WHERE d.database_id > 4
GROUP BY d.name
ORDER BY d.name
你可以检查一下。这将抛出异常:
DECLARE @i INT = 2147483647
SELECT @i + 1
这有效:
DECLARE @i INT = 2147483647
SELECT @i + 1.0
您可以阅读类型优先级https://msdn.microsoft.com/en-us/library/ms190309.aspx:
当一个运算符组合了两个不同数据类型的表达式时, 数据类型优先级的规则指定具有的数据类型 较低的优先级转换为具有较高的数据类型 优先级。
答案 2 :(得分:0)
它正在破碎,因为当你总结mf.size时,它超过了int可以容纳的最大数量数据类型,即2,147,483,647。要修复它,只需转换mf.size,或者* 8/1024可以写成/128.0,如下所示:
SELECT d.name,
ROUND(SUM(CAST(mf.size AS bigint))/128.0, 0) Size_MBs
FROM sys.master_files mf
INNER JOIN sys.databases d ON d.database_id = mf.database_id
WHERE d.database_id > 4
GROUP BY d.name
ORDER BY d.name
答案 3 :(得分:0)
试试这个:
SELECT d.name,
ROUND(SUM(CAST(mf.size as bigint)) * 8 / 1024, 0) Size_MBs
FROM sys.master_files mf
INNER JOIN sys.databases d ON d.database_id = mf.database_id
WHERE d.database_id > 4
GROUP BY d.name
ORDER BY d.name