【问题标题】:Matching on Values, but Erroring on New Value in SQL Server值匹配,但 SQL Server 中的新值出错
【发布时间】:2020-06-11 21:10:46
【问题描述】:

我在我的 Node 项目中比较来自两个不同数据库(一个 MariaDB 和一个 SQL Server)的数据,然后根据比较结果进行必要的插入和更新。

我对这段代码有疑问):

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 Server 中的值是 char(21) 类型的,值如下所示:00000516542-000。 MariaDB 中的值是INT 类型。

那么两个问题:

  1. 当我输入当前不匹配的值时会出现此错误吗?

  2. 如果是这样,我该如何处理,以便在未找到匹配项时只返回 0 行?

顺便说一句,有人建议使用TRY_CONVERT,但是虽然这在 SQL Server 中有效,但当我将它与 NODE mssql 包一起使用时它不起作用。

【问题讨论】:

    标签: sql node.js sql-server-2005


    【解决方案1】:

    我认为问题正在发生,因为 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'
    

    【讨论】:

    • 如果找不到该值,它不能将其转换为 INTEGER,因此会出错吗?
    • 比较的左侧尝试从 varchar 值中提取值的某个部分。如果提取的值都是数字,则转换为 int 将起作用,否则它不会
    • 比较是在转换之后进行的,所以失败是在转换之前发生的。在 varchar 中进行比较应该可以解决这个问题
    • 当我尝试这个时,它看起来好像在找到它时没有返回值。所以它可以防止错误,但在它确实存在时找不到值?
    • 哈哈...我知道他是...但这不会阻止我支持 CR7 ;)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-11
    • 1970-01-01
    • 2015-08-12
    • 1970-01-01
    • 1970-01-01
    • 2014-01-28
    • 1970-01-01
    相关资源
    最近更新 更多