2

約 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
4

1 に答える 1

1

これ

SELECT POWER(2, 31)

動作しません (算術オーバーフロー エラーが発生します)。でもこれは

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

する:

----------
2147483648

@baseパラメータが存在する2つの関数で、パラメータの型が異なります。パラメータがint_ _@basebigint

于 2012-04-27T23:01:03.150 に答える