Соответствие значениям, но ошибка на новом значении на SQL сервере - PullRequest
1 голос
/ 27 февраля 2020

Я сравниваю данные из двух разных баз данных (одна MariaDB и одна SQL Сервер) в моем проекте Node, а затем выполняю вставки и обновления по мере необходимости в зависимости от результатов сравнения.

У меня есть вопрос об этом коде, который я использую, чтобы перебирать результаты в Node, переходя по одному за раз и передавая значения для проверки (примечание - я больше знаком с Node и JS, чем с SQL, отсюда этот вопрос):

SELECT TOP 1
    CASE 
       WHEN RM00101.CUSTCLAS LIKE ('%CUSR%') 
          THEN CAST(REPLACE(LEFT(LR301.DOCNUMBR, CHARINDEX('-', LR301.DOCNUMBR)), '-', '') AS INT) 
          ELSE 0 
    END AS Id,
    CASE 
       WHEN LR301.RMDTYPAL = 7 THEN LR301.ORTRXAMT * -1
       WHEN LR301.RMDTYPAL = 9 THEN LR301.ORTRXAMT * -1
       ELSE LR301.ORTRXAMT
    END DocumentAmount,
    GETDATE() VerifyDate
FROM
    CRDB..RM20101
INNER JOIN 
    CRDB..RM00101 ON LR301.CUSTNMBR = RM00101.CUSTNMBR
WHERE 
    CONVERT(BIGINT, (REPLACE(LEFT(LR301.DOCNUMBR, CHARINDEX('-', LR301.DOCNUMBR)), '-', ''))) = 589091

В настоящее время вышеупомянутое работает для меня, чтобы найти записи, которые соответствуют. Однако, если я ввожу значение, которое еще не существует - в этой строке ниже, например, так:

WHERE CONVERT(BIGINT, (REPLACE(LEFT( LR301.DOCNUMBR, CHARINDEX('-', LR301.DOCNUMBR)), '-', ''))) = 789091

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

Ошибка преобразования типа данных varchar в bigint.

Я предполагаю, что проблема заключается в том, что, если значение не найдено, оно не может привести его к INTEGER и поэтому выдает ошибку. Звучит правильно?

В идеале я хочу, чтобы запрос успешно выполнялся, а просто возвращал 0 результатов, если совпадение не найдено. В JavaScript я мог бы сделать что-то вроде предложения OR, чтобы справиться с этим:

const array = returnResults || [];

Но я не уверен, как справиться с этим с помощью SQL.

. Кстати, значение в SQL Соответствующем сервере имеет тип char(21), и значения выглядят так: 00000516542-000. Значение в MariaDB имеет тип INT.

Итак, два вопроса:

  1. Появится ли эта ошибка при вводе значения, которое в данный момент не соответствует?

  2. Если так, как я могу справиться с этим, чтобы просто вернуть 0 строк, когда совпадение не найдено?

Кстати, как добавленное примечание, кто-то предложил использовать TRY_CONVERT, но хотя это работает на SQL сервере, оно не работает, когда я использую его с пакетом NODE mssql.

1 Ответ

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

Я думаю, что проблема происходит, потому что значение varchar не всегда состоит из чисел. Вы можете выполнить сравнение в самом формате varchar, чтобы избежать этой проблемы:

WHERE (REPLACE(LEFT( LR301.DOCNUMBR, CHARINDEX('-', LR301.DOCNUMBR)), '-', '')) = '789091'

Надеюсь, это поможет.

Редактировать: в зависимости от формата в комментарии это должно сработать;

WHERE REPLACE(LTRIM(REPLACE(REPLACE(LEFT( LR301.DOCNUMBR, CHARINDEX('-', LR301.DOCNUMBR)),'0',' '),'-','')),' ','0') = '789091'
...