2016-05-23 5 views
0

Я использую SQL Server 2008 r2. Когда я запускаю свой запрос, я получаю «Арифметическое переполнение ошибки при преобразовании выражения в тип данных int». Я подозреваю, что проблема находится в той части, которая начинается с функции RIGHT. Вот весь запрос.TSQL String Конкатенация Ошибка арифметического переполнения

SELECT 
    'AA' + --BANK NUMBER 
    TDAccountNumber + --ACCOUNT NUMBER 
    '   ' + --SECURITY NUMBER 
    '  ' + --POSTING DATE 
    RIGHT('0000000000000' + CONVERT(VARCHAR(13),CONVERT(INT,ABS(A.PRINCIPALCASHBALANCE * 100))),13) + --INCOME CASH AMOUNT 
    '0000000000000' + --PRINCIPAL CASH AMOUNT 
    '640' + --TAX CODE 
    ' ' + --REG CODE 
    ' ' + --STATEMENT PRINT CODE 
    '     ' + --SPACES 
    CASE 
     WHEN A.PRINCIPALCASHBALANCE > 0 THEN '[email protected]' 
     ELSE '[email protected]' 
    END + --TRAN CODE 
    CHAR(13) + CHAR(10) + --NEW LINE 
    'AA' + --BANK NUMBER 
    TDAccountNumber + --ACCOUNT NUMBER 
    '   ' + --SECURITY NUMBER 
    'TRANSFER FROM PRINCIPAL TO INCOME ' + --DESCRIPTION 
    '      ' + --SPACES 
    CASE 
     WHEN A.PRINCIPALCASHBALANCE > 0 THEN 'T4B' 
     ELSE 'T3B' 
    END --TRAN CODE 

    FROM 
     TableName 

Странная часть что если я закомментировать все части моего выбора пункта за исключением строки, которая начинается с ПРАВОЙ функцией, результаты, как я ожидал. Если я прокомментирую только эту строку и выберем остальные, результаты будут такими, как я ожидаю. Я делаю то, что я пока не понимаю, когда пытаюсь выбрать все вместе. Заранее благодарим за любую помощь в понимании пути решения этой проблемы.

+1

Те, кто выглядит как довольно большие цифры. Это может быть так же просто, как использовать bigint вместо int. int только содержит числа + - 2,1 миллиарда. https://msdn.microsoft.com/en-us/library/ms187745.aspx –

+0

Можете ли вы предоставить несколько примеров записей, которые воссоздают ошибку? Было бы также полезно, если бы вы могли включить типы данных для своих полей. –

ответ

2

Ваше значение для A.PRINCIPALCASHBALANCE (при умножении на 100) просто переполняет максимальный размер int.

Состояние the docs, максимальное значение, которое может содержать int, составляет 2,147,483,647. Поэтому, если мы сломаем то, что у вас есть, и просто выполните:

select CONVERT(INT,ABS(21474836 * 100)) 

Тогда он отлично работает. Однако, если мы изменим, что так будет переполнение:

select CONVERT(INT,ABS(21474837 * 100)) 

Тогда мы получим ошибку

Msg 8115, уровень 16, состояние 2, строка 1 Ошибка арифметического переполнения при преобразовании выражения для данных типа междунар ,

То же самое произойдет, если вы находитесь за пределами нижней границы int.

+0

Вы покрыли все пункты, которые у меня есть, и больше, поэтому я удалю свой ответ и оставлю свой ответ. – Bridge

+0

Это имеет смысл для меня, я меняю INT на BIGINT, и запрос заканчивается с ожидаемыми результатами. Только ради образования, может кто-нибудь объяснить, почему моя оригинальная линия будет работать нормально, когда она будет запущена сама по себе, но будет переполняться в сочетании с остальными полями выбора? – Gavin

0

Звучит как значение A.PRINCIPALCASHBALANCE * 100 является большим для int.

Можете ли вы попробовать что-то вроде этого?

SELECT RIGHT('00000000000' + CONVERT(VARCHAR(11),CONVERT(INT,ABS(A.PRINCIPALCASHBALANCE))),11)+'00' 
Смежные вопросы