sql server将size转换为int

时间:2015-05-22 15:29:47

标签: sql sql-server tsql

我想获得此查询的结果,但我收到以下错误

  

将表达式转换为数据类型int的算术溢出错误

{{1}}

4 个答案:

答案 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列为int8也为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