值匹配,但 SQL 服务器中的新值出错
Matching on Values, but Erroring on New Value in SQL Server
我在我的 Node 项目中比较来自两个不同数据库(一个 MariaDB 和一个 SQL 服务器)的数据,然后根据比较结果进行必要的插入和更新。
我对这段代码有疑问,我用它来遍历 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
我收到这个错误:
Error converting data type varchar to bigint.
我认为问题在于,如果未找到该值,则无法将其转换为 INTEGER,因此会出错。听起来对吗?
理想情况下,我希望查询能够成功执行,但在未找到匹配项时只有 return 0 个结果。在 JavaScript 中,我可能会做类似 OR
子句的事情来处理这个问题:
const array = returnResults || [];
但我不确定如何用 SQL 处理这个问题。
顺便说一句,正在匹配的 SQL 服务器中的值是 char(21)
类型,值如下所示:00000516542-000
。 MariaDB 中的值是 INT
.
类型
所以两个问题:
当我输入当前不匹配的值时会出现此错误吗?
如果是这样,我该如何处理才能在找不到匹配项时只显示 return 0 行?
顺便说一句,作为补充说明,有人建议使用 TRY_CONVERT
,但是虽然这在 SQL 服务器中有效,但当我将它与 NODE [=19] 一起使用时它不起作用=] 包.
我认为问题的发生是因为 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'
我在我的 Node 项目中比较来自两个不同数据库(一个 MariaDB 和一个 SQL 服务器)的数据,然后根据比较结果进行必要的插入和更新。
我对这段代码有疑问,我用它来遍历 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
我收到这个错误:
Error converting data type varchar to bigint.
我认为问题在于,如果未找到该值,则无法将其转换为 INTEGER,因此会出错。听起来对吗?
理想情况下,我希望查询能够成功执行,但在未找到匹配项时只有 return 0 个结果。在 JavaScript 中,我可能会做类似 OR
子句的事情来处理这个问题:
const array = returnResults || [];
但我不确定如何用 SQL 处理这个问题。
顺便说一句,正在匹配的 SQL 服务器中的值是 char(21)
类型,值如下所示:00000516542-000
。 MariaDB 中的值是 INT
.
所以两个问题:
当我输入当前不匹配的值时会出现此错误吗?
如果是这样,我该如何处理才能在找不到匹配项时只显示 return 0 行?
顺便说一句,作为补充说明,有人建议使用 TRY_CONVERT
,但是虽然这在 SQL 服务器中有效,但当我将它与 NODE [=19] 一起使用时它不起作用=] 包.
我认为问题的发生是因为 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'