Соответствие двум значениям разных типов в двух SQL базах данных - PullRequest
0 голосов
/ 27 февраля 2020

Я пытаюсь сравнить записи между двумя различными SQL таблицами / базами данных в моем проекте Node, и мне нужно выполнить какое-то преобразование для сравнения значений.

В одной базе данных (MariaDB) значение имеет тип INT и выглядит следующим образом: 516542

В другой (SQL Server) базе данных значение, которое мне нужно match соответствует типу char(21) и выглядит следующим образом: 00000516542-000

Я пытался сделать следующее:

WHERE (REPLACE(LEFT( LM301.DOCNUMBR, CHARINDEX('-', LM301.DOCNUMBR)), '-', '')) = 516542

Это работает для некоторых записей, но для других я получаю эта ошибка:

"Преобразование значения varchar '0004000009123' переполнило столбец int."

Если я передаю первое значение в виде строки ('516542 ') это не соответствует вообще.

Как я могу справиться с этим сценарием?

Ответы [ 2 ]

1 голос
/ 27 февраля 2020

Вам нужно сделать явный тип разговор с TRY_CONVERT():

TRY_CONVERT(BIGINT, LEFT(LM301.DOCNUMBR, CHARINDEX('-', LM301.DOCNUMBR + '-') - 1)) = 516542

TRY_CONVERT() вернет NULL, если разговор не удастся.

Вы не Не нужно использовать replace(), вы можете вычесть позицию.

РЕДАКТИРОВАТЬ: Try_CONVERT() доступен с 2012 +. Для более старой версии вы можете сделать:

(CONVERT(BIGINT, LEFT(LM301.DOCNUMBR, CHARINDEX('-', LM301.DOCNUMBR) - 1)) = 516542 AND
 CHARINDEX('-', LM301.DOCNUMBR) > 0)
)

Примечание: это может произойти сбой, если DOCNUMBR не имеет числовое значение c до -.

1 голос
/ 27 февраля 2020

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

По сути, где-то в вашем CHAR (21). Существует значение, которое больше, чем int32, или SQL Тип сервера int, по значению. Это значение: 2 147 483 648. 4 000 009 123 больше этого максимального значения, указанного в сообщении об ошибке.

СУБД с помощью оператора where попытается выполнить операцию и сравнить все записи, что приведет к переполнению. Вместо этого вы можете сделать сравнение строк. Или попробуйте явное преобразование и преобразуйте его в bigint.

WHERE CONVERT(BIGINT, (REPLACE(LEFT( LM301.DOCNUMBR, CHARINDEX('-', LM301.DOCNUMBR)), '-', ''))) = 516542

Он выполняет неявное приведение к INT, потому что это ваш тип сравнения, а затем переполняется. Сделав явное преобразование, вы сможете вместо этого определить тип данных.

По сути, что происходит:

IF ('21474836480' >= 100) --Implicit conversion: Error and prints false
    PRINT 'True'
ELSE
    PRINT 'False'

IF ('214748364' >= 100) --Implicit Conversion: True
    PRINT 'True'
ELSE
    PRINT 'False'

IF (CONVERT(BIGINT, '21474836480') >= 100) --Explicit Conversion: Prints True
    PRINT 'True'
ELSE
    PRINT 'False'

Поэтому перенос значения в явное преобразование должен исправить вашу ошибку.

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