我希望基于作为函数参数的Studio检索利润的值(FilmBoxOfficeDollar-FilmBudgetDollars)。
USE Movies;
GO
CREATE FUNCTION fnmovieProfits(@StudioName nvarchar(255))
RETURNS int
AS
BEGIN
RETURN (SELECT SUM(FilmBoxOfficeDollars - FilmBudgetDollars)
FROM Film JOIN Studio
ON Film.FilmStudioID = Studio.StudioID
WHERE StudioName = @StudioName);
END;
GO
SELECT [dbo].[fnmovieProfits]('Dreamworks');
每当我执行此操作以提取数据时,都会出现以下错误:
Msg 8115, Level 16, State 2, Line 13
Arithmetic overflow error converting expression to data type int.
任何帮助将不胜感激!
答案 0 :(得分:0)
您的总和超出了int
范围。您应该将返回类型定义为bigint
:
CREATE FUNCTION fnmovieProfits(@StudioName nvarchar(255))
RETURNS bigint
AS.......
使用int
作为返回类型可以返回的最大值为2147483647
。您的sum
可能会更大。
一个超出其返回类型的函数示例:
CREATE FUNCTION testFunction()
RETURNS int
AS
BEGIN
RETURN (SELECT 2147483647 + 1);
END;
GO
SELECT [dbo].[testFunction]();
如果执行它,将出现以下错误:
Msg 8115, Level 16, State 2, Line 8
Arithmetic overflow error converting expression to data type int.
因此解决方案只是通过将int
替换为bigint
来增加返回类型范围。
答案 1 :(得分:0)
您遇到的问题是您溢出了32位数字(INT)的允许值;如果强制转换/转换为64位数字(BIGINT)并返回该数据类型,则将解决此问题。显示问题的概念证明:
python3 file_name.py
但,请帮个忙,改用视图。这样的标量对于报告的表现非常糟糕。除非标量函数只是根据输入值进行计算(即不命中基础的,持久的数据),否则切勿使用标量函数。
DECLARE @BigNumber INT=2000000000
select CONVERT(BIGINT,@BigNumber) + CONVERT(BIGINT,@BigNumber) --returns 4,000,000,000
select (@BigNumber + @BigNumber) --errors with "Arithmetic overflow error converting expression to data type int."
与SQL Server数据类型相关的reading。具体来说,integer datatypes。