运行表值函数时,我遇到了大约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
答案 0 :(得分:1)
此
SELECT POWER(2, 31)
不起作用(产生算术溢出错误)。但是这个
SELECT POWER(CAST(2 AS bigint), 31)
确实
----------
2147483648
@base
参数在您存在的两个函数中具有不同的类型。问题在于参数为int
的情况,而另一个问题是,正如您所说的,@base
的{{1}}为bigint
似乎与我的发现非常一致,我猜