You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用存储过程:Node.js接口返回空结果但SSMS执行正常

问题原因及解决办法

核心原因:日期格式解析差异与SQL拼接的参数类型问题

你遇到的情况大概率是SQL Server会话的日期格式设置不同导致的:SSMS默认的日期格式可能是dd/mm/yyyy(英式格式),但Node.js通过mssql包连接数据库时,会话的日期格式是mm/dd/yyyy(美式格式)。你拼接的日期'04/10/2023'在SSMS里被解析为10月4日,但在Node的数据库会话里被解析为4月10日,导致查询范围没有匹配的数据,返回空结果。

另外,直接拼接SQL语句不仅有SQL注入风险,还容易出现参数类型不匹配的问题,这也是导致结果异常的潜在因素。

解决步骤

1. 使用参数化查询替代SQL拼接(优先推荐)

mssql包支持参数绑定,能自动处理参数类型和格式,避免手动拼接的问题。修改你的Node.js接口代码如下:

app.get('/api/consultRS', (req, res) => {
  sql2.connect(sqlConfigS, function(err) {
    if (err) {
      console.log('connection error is: ' + err);
      return res.send(err);
    }
    const request = new sql2.Request();
    // 绑定参数并指定类型
    request.input('agency', sql2.VarChar, req.query.agency);
    request.input('since', sql2.DateTime, new Date(req.query.since));
    request.input('upTo', sql2.DateTime, new Date(req.query.upTo));
    // 调用存储过程,使用参数占位符
    request.execute('prc.procedureRN', function(err, records) {
      console.log('Stored procedure executed');
      if (err) {
        console.log('error= ' + err);
        return res.send(err);
      } else {
        console.log(records);
        res.send(records);
      }
    });
  });
});

2. 显式指定日期格式

如果必须使用SQL拼接,需要把日期转换为SQL Server能统一解析的格式(比如yyyy-mm-dd):

// 转换日期字符串为yyyy-mm-dd格式
const formatDate = (dateStr) => {
  const date = new Date(dateStr);
  return `${date.getFullYear()}-${String(date.getMonth()+1).padStart(2, '0')}-${String(date.getDate()).padStart(2, '0')}`;
};

// 修改查询语句
const sinceFormatted = formatDate(req.query.since);
const upToFormatted = formatDate(req.query.upTo);
const query = `exec prc.procedureRN '${req.query.agency}','${sinceFormatted}','${upToFormatted}'`;

3. 统一数据库会话的日期格式

可以在Node的数据库连接中执行SELECT @@DATEFORMAT查看当前会话的日期格式,和SSMS执行同样的语句对比。如果确实是格式差异,可在连接后执行SET DATEFORMAT dmy;统一格式:

sql2.connect(sqlConfigS, function(err) {
  if (err) {
    console.log('connection error is: ' + err);
    return res.send(err);
  }
  const request = new sql2.Request();
  // 设置日期格式为dd/mm/yyyy
  request.query('SET DATEFORMAT dmy;', (err) => {
    if (err) {
      console.log('set date format error: ' + err);
      return res.send(err);
    }
    // 再执行存储过程查询
    const query = `exec prc.procedureRN '${req.query.agency}','${req.query.since}','${req.query.upTo}'`;
    request.query(query, function(err, records) {
      // 后续逻辑
      if (err) {
        console.log('error= ' + err);
        res.send(err);
      } else {
        console.log(records);
        res.send(records);
      }
    });
  });
});

为什么其他存储过程正常?

其他存储过程可能没有日期参数,或者日期参数的范围足够宽泛(比如查询整个月份),即使日期格式解析错误,仍然能匹配到数据;或者它们的参数类型是字符串而非日期,不会受日期格式影响。

内容的提问来源于stack exchange,提问作者Mantequita

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.09 10:25:21