2014-08-27 2 views
0

Хорошо, это тяжело или глупо, но это меня озадачило. Я работаю с серийными номерами в MSSQL, и они хранятся в базе данных как nvarchar (50), и для вычисления вычитания на них я использую следующий запрос, чтобы преобразовать их в тип данных BIGINT и вычесть как обычно.Вычитание чисел, длина которых превышает 18 цифр

SELECT 
SUM(
CAST(second_Serial_Nb AS BIGINT)-CAST(Serial_Nb AS BIGINT)) 
FROM [TEST].[dbo].[Serial_Table] 
WHERE ID = '3' 

этот запрос отлично работает для серийных номеров до 18 цифр в длине, но как только я увеличить там размер серийных номеров до 20 цифр в длине я получаю ошибку, что числа не могут быть преобразованы в data-type bigint

Msg 8815, Level 16, State 2, Line 2 
Arithmetic overflow error converting expression to data type bigint 

Есть ли работа с использованием другого типа данных данных типа hexi или что-то в этом роде. Я также использую C++, может быть, я мог бы создать там функцию вместо SQL?

Любые комментарии или предложения с благодарностью, спасибо за чтение.

ответ

1

BIGINT - просто нормальное 64-битное целое число. Это не произвольное целое число.

Если вы хотите сохранить дополнительную информацию, вы можете хранить ее в строковой форме или использовать тип NUMERIC или DECIMAL; оба решения, конечно, намного медленнее, чем собственное целое число с фиксированной шириной.

+0

Hi @Kerrek SB, он хранится в БД в виде строки, но мне нужно вычесть каждый серийный номер из одного другого, чтобы узнать, что такое диапазон. Если у меня есть серийный номер длиной 20 цифр, например «12345678998745632145», а другой - «12345632145236578941», я не могу их вычитать, потому что я не могу преобразовать их в подходящий формат данных или номер – OMUIRI

+0

@OMUIRI: вы можете преобразуйте их оба в 'NUMERIC'. –

+0

@OMUIRI вы можете выполнить вычитание, поместив число в связанном списке и вычтите оба связанных списка и верните результат в виде связанного списка. – instance

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