SQL标量值函数

时间:2019-03-14 18:08:57

标签: sql-server tsql parameters user-defined-functions

我希望基于作为函数参数的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.

任何帮助将不胜感激!

2 个答案:

答案 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