Tedious或Sequelize使用`findOne()`的错误语法

Jer*_*emy 5 sql-server-2008 node.js sequelize.js tedious

我正在使用Sequelize with Tedious来访问SQL Server 2008.

当我这样做时,sequelizeModel.findOne()我得到了这个例外 -

未处理的拒绝SequelizeDatabaseError:FETCH语句中NEXT选项的使用无效.

我知道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;
Run Code Online (Sandbox Code Playgroud)

tre*_*123 5

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

我在GitHub上提交了这个问题:https://github.com/sequelize/sequelize/issues/4404

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

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

  • 这发生在我的`findAll({limit:10,offset:10})`因为它使用Fetch和Next分页,但是因为使用msssql 2008我得到了错误 (3认同)