Node.js调用SQL Server存储过程报错varchar转int类型失败求助
报错根因
Error converting data type varchar to int
该报错是因为你传入存储过程的参数类型与存储过程定义的参数类型不匹配:你当前手动拼接SQL时给所有参数都加了单引号,全部作为varchar类型传入,但存储过程的入参中至少有一个是int类型,数据库自动转换类型失败。
现有代码问题排查
- 参数名拼写错误:你前面定义变量时取的是
req.params.TagAlternateKey和req.params.ProcessOfProductionKey,但拼接SQL时用的是req.params._TagAlternateKey和req.params._ProcessOfProductionKey,多了前缀下划线,可能实际取到空值/undefined,转为字符串传入会进一步触发类型错误。 - 混用await与回调:
query方法同时使用await和回调属于语法错误,两种异步写法二选一即可。 - SQL拼接风险:手动拼接SQL不仅容易出现类型匹配错误,还存在SQL注入漏洞,不推荐使用。
修复方案
推荐使用mssql库自带的参数化查询实现,会自动处理类型匹配问题,无需手动拼接SQL:
const sql = require('mssql') exports.Checkskip = async function(req, res) { try { // 先确认req.params的参数名,修正下划线拼写错误 const tagAlternateKey = req.params.TagAlternateKey; // 提前将int类型的参数转为数值 const processOfProductionKey = parseInt(req.params.ProcessOfProductionKey); const pool = await poolPromise; // 用参数化方式绑定入参,类型和存储过程定义保持一致即可 const result = await pool.request() .input('TagAlternateKey', sql.VarChar, tagAlternateKey) // 此处sql.Int对应存储过程的int类型参数,如果是其他类型按需修改 .input('ProcessOfProductionKey', sql.Int, processOfProductionKey) // 直接用execute方法调用存储过程,无需手动拼接 .execute('[wos].[StoredInternalProcessTransactionCheckProcessBeforeReceiving]') res.json(result.recordset); }catch (err){ console.log(err) res.status(500).send(err.message) } }
如果需要兼容原有拼接写法,只需将int类型的参数外层的单引号去掉即可,但该方式依然存在安全风险,不推荐使用。
额外校验步骤
如果修改后仍报错,可按以下顺序排查:
- 查看存储过程的入参定义,确认两个参数的类型与你在
input中指定的类型完全一致 - 打印
req.params确认你拿到的入参值是合法的,不存在空值、非数字字符等异常内容
内容的提问来源于stack exchange,提问作者Kittiphob Rakyutitham
相关产品推荐
相关产品推荐

