2

在为大约 50000 条记录运行表值函数时出现算术溢出错误。

错误:“int 类型的算术溢出错误,值 = 2147483648.000000”

当我使用标量函数时,我没有同样的问题。我想知道我是否可以克服这个问题

我从http://www.sqlmag.com/article/tsql3/performing-base-conversions获得了 baseconversion 的代码

这是我的内联和标量函数。Nums 表有一个名为 n 的 bigint 字段。它有 200000 行

   --- 
   --- Inline
   ---
   CREATE FUNCTION dbo.ConvertFromBase
   (@val AS VARCHAR(63))
   RETURNS TABLE
   RETURN
   (SELECT SUM(
   (CHARINDEX(
      SUBSTRING(@val, LEN(@val) - n + 1, 1),
      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') - 1)
   *POWER(2, n-1) )  AS Value
 FROM Nums
 WHERE n <= LEN(@val));

   --- 
   --- Scalar
   ---

    CREATE FUNCTION dbo.fn_ConvertFromBase
    (@val AS VARCHAR(63), @base AS int)
    RETURNS BIGINT
    BEGIN
    DECLARE @RESULT BIGINT 
    SELECT @result =SUM(
    (CHARINDEX(
      SUBSTRING(@val, LEN(@val) - n + 1, 1),
      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') - 1)
   *POWER(@base, n-1))  
   FROM Nums
   WHERE n <= LEN(@val)

 RETURN @result

结尾

我将表值函数转换为返回表变量,它似乎正在工作。不过,这可能表现不佳。我需要做更多的研究

  CREATE FUNCTION [dbo].[ConvertFromBasenew]
  (@val AS VARCHAR(63), @base AS bigint)
  RETURNS @TableVar TABLE(VALUE BIGINT)
  BEGIN
  INSERT INTO @TableVar
  SELECT SUM(CONVERT(BIGINT,
   (CHARINDEX(
      SUBSTRING(@val, LEN(@val) - n + 1, 1),
      '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ') - 1)
   *CAST(POWER(@base, n-1) AS BIGINT)))  AS Value
  FROM Nums
  WHERE n <= LEN(@val)
  RETURN
 END  

我用来调用函数的代码

    SELECT  * FROM dbo.FinalBitmapTable
    CROSS APPLY dbo.ConvertFromBase(fINALBitmap,2) b
4

1 回答 1

1

这个

SELECT POWER(2, 31)

不起作用(产生算术溢出错误)。但是这个

SELECT POWER(CAST(2 AS bigint), 31)

做:

----------
2147483648

@base参数在您存在的两个函数中具有不同的类型。问题在于参数为 的那个int,而另一个有效的,正如你所说,@base似乎bigint与我的发现非常一致,我猜。

于 2012-04-27T23:01:03.150 回答