約 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