我正在使用带有 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
方法。该方法的解决方法是使用 findAll
和 where
来指定 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/