Ошибка арифметического переполнения при преобразовании varchar в числовой тип данных (SQL)

У меня есть настройка базы данных MS SQL 2017, и я отправляю теги RFID в таблицу, а затем запрашиваю таблицу позже, чтобы узнать, существует ли пользователь в системе.

Я получаю сообщение об ошибке:

'Arithmatic overflow error converting varchar to data type numeric'.

Я попытался изменить тип rfid_id на VARCHAR(MAX), но безуспешно.

Моя таблица:

CREATE TABLE worker_table ('worker_id INT IDENTITY(1,1) PRIMARY KEY, 
rfid_id VARCHAR(30) NOT NULL, 
worker_customer_name VARCHAR(30) NOT NULL,
site_id INTEGER NOT NULL REFERENCES site_table(site_id))

Это прекрасно работает.

Данные, которые я вставляю в таблицу для данного RFID:

INSERT INTO worker_table(rfid_id, worker_customer_name, site_id, worker_id 
VALUES ($'10103967375$', $'USER_1$', $'1$', $'1'))

Это также отлично работает для большинства RFID-меток.

Однако некоторые теги имеют разную длину, например 330004531017 или 9600007487626. Некоторые теги пишут в базу данных OK, а некоторые возвращают ошибку.

Также, если я запрашиваю базу данных с помощью:

SELECT CASE WHEN EXISTS(SELECT * FROM worker_table WHERE rfid_id =9600007487626) THEN 100 ELSE 200 END)

Это нормально работает для большинства тегов, но для некоторых возвращает ту же ошибку.

PS В настоящее время я отправляю rfid_id в виде строки с моего ПЛК.

Мои знания в SQL ограничены, поэтому любая помощь будет очень признательна, пожалуйста, и спасибо.

rfid_id — это строка (символы), и ее следует проверять с помощью «9600007487626» с кавычками, не так ли?

B. Go 27.05.2019 16:21
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
2
1
43
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Используйте одинарные кавычки, потому что ваш тег представляет собой строку:

SELECT (CASE WHEN EXISTS (SELECT 1
                          FROM worker_table
                          WHERE rfid_id = '9600007487626'
                         ) 
            THEN 100 ELSE 200
        END)

Когда вы опускаете одинарные кавычки, значение является числом, а rfid_id преобразуется в число — отсюда и переполнение.

Просто используйте сравнение строк.

Привет, Гордон, на самом деле я отправляю rfid_id в одинарных кавычках. См. необработанный код ниже, где я создаю строку для отправки с ПЛК. Я просто упростил это для поста. Если вы будете следовать 'strQ' по мере его создания, вы получите rfid_id внутри ''.

Niall O'Reilly 27.05.2019 16:08

memset(ADR(strQ), 0, SIZEOF(strQ)); strcpy(ADR(strQ), ADR('INSERT INTO worker_table')); strcat(ADR(strQ), ADR(' (rfid_id, woker_nme, site_id, worker_id )')); strcat(ADR(strQ), ADR(' ЗНАЧЕНИЯ ($'')); strcat(ADR(strQ), ADR(myData.rfid_id)); strcat(ADR(strQ), ADR('$', $'') ); strcat(ADR(strQ), ADR(myData.woker_name)); strcat(ADR(strQ), ADR('$', $'')); ftoa(myData.site_id, ADR(strQ) + strlen(ADR (strQ))); strcat(ADR(strQ), ADR('$', $'')); ftoa(myData.worker_id, ADR(strQ) + strlen(ADR(strQ))); strcat(ADR(strQ ), ADR('$')'));

Niall O'Reilly 27.05.2019 16:14

Привет Гордон, спасибо! Оказывается, я добавлял rfid_id в виде строки внутри ''. Но когда я запрашивал, существует ли пользователь для входа в систему (я также делаю это перед добавлением нового пользователя), я не использовал ''.

Niall O'Reilly 27.05.2019 16:33

В SQL Server максимальная точность числового типа данных по умолчанию равна 38, а в более ранней версии
который поддерживался только до символов

По причине, когда вы конвертируете varchar в числовое переполнение, произошло

Другие вопросы по теме