使用表值函数进行基本转换时出错

时间:2012-04-26 12:52:43

标签: sql-server-2008 sql-server-2008-r2

运行表值函数时,我遇到了大约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

END

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

  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

1 个答案:

答案 0 :(得分:1)

SELECT POWER(2, 31)

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

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

确实

----------
2147483648

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