在为大约 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