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

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

Я получаю ошибку:

'Ошибка арифметического переполнения при преобразовании varchar в тип данных 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. Некоторые теги пишут ОК в базу данных, но некоторые возвращают ошибку.

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

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

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

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

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

Ответы [ 2 ]

1 голос
/ 27 мая 2019

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

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

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

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

0 голосов
/ 27 мая 2019

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

Из-за возникшей причины при преобразовании varchar в числовое переполнение

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...