2014-01-21 4 views
0

У меня есть следующий запрос, где тип данных accc_no - varchar, wthdrl_amt - деньги, sav_amt - деньги, trxn_id - bigint.Арифметическая ошибка переполнения преобразования выражения в тип данных money

DECLARE @acc_no NVARCHAR(MAX) = N'' 
DECLARE @symbol NVARCHAR(MAX) = N'' 
DECLARE @loop int = 0 
DECLARE @loop2 int = 0 

SELECT @symbol += N'' + acc_no + ',' FROM sav_transaction GROUP BY acc_no HAVING (SUM(sav_amt)<SUM(wthdrl_amt)) 
IF LEN(@symbol) > 1 
BEGIN 
    WHILE @loop < LEN(@symbol) 
    BEGIN 
     SET @loop2 = CHARINDEX(',', @symbol ,@loop) 
     SET @acc_no = SUBSTRING(@symbol, @loop, @[email protected]) 

     UPDATE sav_transaction 
     SET wthdrl_amt = wthdrl_amt-(SELECT ABS(SUM(sav_amt) - SUM(wthdrl_amt)) 
     FROM sav_transaction WHERE acc_no = @acc_no) 
     WHERE acc_no = @acc_no AND trxn_id = (SELECT MAX(trxn_id) FROM sav_transaction WHERE acc_no = @acc_no) 
    END 
    SET @loop = @loop2 +1 
END 

Но когда я запускаю это, я получаю сообщение об ошибке:

Msg 8115, Level 16, State 2, Line 15 
Arithmetic overflow error converting expression to data type money. 
The statement has been terminated. 

Я использовал поле с тем же типом данных. Но не удалось найти ошибку.

ответ

0

Изменен этот раздел ВЫБОР @symbol + = N '' + CAST (acc_no AS nvarchar (MAX)) +, поскольку acc_no не является nvarchar и имеет приоритет во время операции добавления и пытается использовать N '' и другие дополнения к его типу

DECLARE @acc_no NVARCHAR(MAX) = N'' 
    DECLARE @symbol NVARCHAR(MAX) = N'' 
    DECLARE @loop int = 0 
    DECLARE @loop2 int = 0 

    SELECT @symbol += N'' + CAST(acc_no AS nvarchar(MAX)) + ',' FROM sav_transaction GROUP BY acc_no HAVING (SUM(sav_amt)<SUM(wthdrl_amt)) 
    IF LEN(@symbol) > 1 
    BEGIN 
    WHILE @loop < LEN(@symbol) 
    BEGIN 

       SET @loop2 = CHARINDEX(',', @symbol ,@loop) 
       SET @acc_no = SUBSTRING(@symbol, @loop, @[email protected]) 

    UPDATE sav_transaction SET 
    wthdrl_amt = wthdrl_amt-(SELECT SUM(sav_amt) - SUM(wthdrl_amt) FROM sav_transaction WHERE acc_no = @acc_no) 
    WHERE acc_no = @acc_no AND trxn_id = (SELECT MAX(trxn_id) FROM sav_transaction WHERE acc_no = @acc_no) 


    END 
    SET @loop = @loop2 +1 
    END 
+0

Пожалуйста, объясните, что вы сделали –

+0

изменил эту часть ВЫБЕРИТЕ @symbol + = N '' + CAST (acc_no AS NVARCHAR (MAX)) + в acc_no не NVARCHAR и имеет преимущество во время операции добавления и пытается cast N '' и другие дополнения к его типу – DhruvJoshi

+1

Отправьте это в свой ответ man –

1

Чтобы увидеть различия, мы можем смотреть на документацию:

Документация для money:

Data type Range             Storage 
money  -922,337,203,685,477.5808 to 922,337,203,685,477.5807 8 bytes 
smallmoney -214,748.3648 to 214,748.3647       4 bytes 

деньги и smallmoney типы данных точны до десятитысячной части денежных единиц, которые они представляют.

Сравнить с decimal:

При максимальной точности используется, допустимые значения от -10^38 + 1 через 10^38 - 1.

Precision Storage 
1 - 9  5 bytes 
10 - 19  9 bytes 
20 - 28  13 bytes 
29 - 38  17 bytes 

Так они точно не эквивалентны, просто похоже. DECIMAL (19,4) имеет чуть больший диапазон, чем MONEY (он может хранить от -10^15 + 0,0001 до 10^15 - 0,0001), но также нужен еще один байт памяти.

Другими словами, это работает:

CREATE TABLE Table1 (test DECIMAL(19,4) NOT NULL); 
INSERT INTO Table1 (test) VALUES 
(999999999999999.9999); 
SELECT * FROM Table1 

999999999999999.9999 

Но это не делает:

CREATE TABLE Table1 (test MONEY NOT NULL); 
INSERT INTO Table1 (test) VALUES 
(999999999999999.9999); 
SELECT * FROM Table1 

Arithmetic overflow error converting numeric to data type money. 

Там также семантическое различие. Если вы хотите хранить денежные значения, имеет смысл использовать деньги типа.

Source

Смежные вопросы

 Смежные вопросы