首页 > 解决方案 > 修复“动态”查询而不向我抛出给定的错误?

问题描述

UPDATE dbo.Einkauf_Web_Upload 
SET
  ${
    updatedUpload.Menge !== null
      ? `Anzahl = ${`${updatedUpload.Menge}`},`
      : null
  },
  ${
    updatedUpload.ENummer !== null
      ? `ENummer = ${`'${updatedUpload.ENummer}'`}`
      : null
  }
 
  WHERE ... 

这个查询应该区分对象的更新值updatedUpload,最初,它的所有值都设置为空。如果该值未更改因此未更新,则查询不得影响特定列。在当前状态下,查询会引发以下错误:

关键字“null”附近的语法不正确

我知道为什么;如果您不更改 Menge 属性,则查询如下所示:

UPDATE dbo.Einkauf_Web_Upload 
SET null, ENummer = "abc" 
WHERE ..

有解决方法吗?我使用 NodeJs 作为我的后端,并考虑尝试通过映射数组使列引用动态化,该映射数组仅包含updatedUpload.

将不胜感激任何帮助!

标签: sqlnode.jssql-serverexpresssql-update

解决方案


SET null, ...是无效的 SQL 语法,你应该跳过null。此外,如果没有要更新的内容,请记住不要执行查询,因为SET WHERE ...这也是无效的语法。

我会建议类似:

let updates = [
    updatedUpload.Menge !== null ? `Anzahl = ${`${updatedUpload.Menge}`}` : null,
    updatedUpload.ENummer !== null ? `ENummer = ${`'${updatedUpload.ENummer}'`}` : null,
    // ... add here
]

// Filter out null updates
updates = updates.filter(u => !!u);
    
// Do query only if updates are avaliable
if (updates.length > 0) {
    const sql = `UPDATE dbo.Einkauf_Web_Upload SET ${updates.join(', ')} WHERE ...`;
    // ... execute
}

推荐阅读