node.js - Tedious 或 Sequelize 对 `findOne()` 使用了错误的语法

标签 node.js sql-server-2008 sequelize.js tedious

我正在使用带有 Tedious 的 Sequelize 来访问 SQL Server 2008。

当我执行 sequelizeModel.findOne() 时,我得到了这个异常 -

Unhandled rejection SequelizeDatabaseError: Invalid usage of the option NEXT in the FETCH statement.

我知道 SQL Server 2008 不支持 OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY,这就是引发异常的原因。

但是我也已经明确地将繁琐的选项中的tdsVersion设置为7_3_B

如这里所述-
http://pekim.github.io/tedious/api-connection.html

我已经尝试了所有的 tds 版本,生成的查询语法总是包含 FETCH/NEXT 语法。

我错过了什么吗?

语法不应该特定于 tds 版本吗?

我还验证了 tdsVersion 选项已从 sequelize 成功传递到繁琐的连接库。

生成的查询语法示例 -

SELECT 
    [id], [FIRST_NAME], [LAST_NAME]  
FROM  
    [USERs] AS [USERS] 
ORDER BY 
    [id]  
    OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY;

最佳答案

这是 Sequelize 中的一个问题——它使用 OFFSET FETCH语法,仅在 SQL Server 2012 及更新版本中受支持。

我在 GitHub 上将其作为问题提交:https://github.com/sequelize/sequelize/issues/4404

该问题还会影响 findById 方法。该方法的解决方法是使用 findAllwhere 来指定 ID,并且只使用返回数组中的第一个元素:

Thing.findAll({
  where: {id: id}
}).then( function(things) {
  if (things.length == 0) {
    // handle error
  }
  doSomething(things[0])
}).catch( function(err) {
  // handle error
});

关于node.js - Tedious 或 Sequelize 对 `findOne()` 使用了错误的语法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30632779/

相关文章:

transactions - Sequelize CLS 事务未使用

c# - 设置 PublicationMonitor.ConnectionContext 会引发 NullReferenceException

javascript - meteor apollo graphql/sequelize 缓存查询结果以避免多次相同的查询

postgresql - Postgres - 选择日期列值在另一行值范围内的所有行?

node.js - nodejs打开文件太多导致错误

sql-server-2008 - 使用 WHERE 插入

sql - T-SQL 中的 Update 语句出现问题

javascript - NodeJS 嵌套事件监听器

node.js - WebStorm V8 分析 : (Stacktrace cut)?

javascript - 如何从函数返回 javascript 中的数组?