Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 使用表值函数进行基转换时出错_Sql Server 2008_Sql Server 2008 R2 - Fatal编程技术网

Sql server 2008 使用表值函数进行基转换时出错

Sql server 2008 使用表值函数进行基转换时出错,sql-server-2008,sql-server-2008-r2,Sql Server 2008,Sql Server 2008 R2,我在运行表值函数处理大约50000条记录时遇到算术溢出错误 错误:“int类型的算术溢出错误,值=2147483648.000000” 当我使用标量函数时,我没有同样的问题。我想知道我是否能克服这个问题 我从你那里得到了baseconversion的代码 下面是我的内联函数和标量函数。Nums表有一个名为n的bigint字段。它有200000行 --- --- Inline --- CREATE FUNCTION dbo.ConvertFromBase (@val

我在运行表值函数处理大约50000条记录时遇到算术溢出错误

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

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

我从你那里得到了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
这个

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

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

@base
参数在存在的两个函数中具有不同的类型。问题在于其中一个参数是
int
,而另一个,正如您所说,它的工作原理是
@base
,因为
bigint
似乎与我的发现非常一致,我想。

我想您需要在求和表达式中对bigint进行转换?我已经尝试过了,但是,这不起作用。它似乎与我应用该函数的表上的行数有关。我不知道它在哪一点断裂。它的工作原理很好,表中的记录数少于20亿行吗?不,在任何给定的时间里,我只有80000行。有两种含义:最长的字符串和最大的数字——当然应该是相同的,这取决于实际存储的有效数字的数量)。
    SELECT  * FROM dbo.FinalBitmapTable
    CROSS APPLY dbo.ConvertFromBase(fINALBitmap,2) b
SELECT POWER(2, 31)
SELECT POWER(CAST(2 AS bigint), 31)
----------
2147483648