使用 Sequelize.js 在 SQL 2008 分页(不支持 FETCH)

Paginate with Sequelize.js at SQL 2008 (that does not support FETCH)

因此,我使用 sequelize.js 和 tedious 来支持 mssql。 MSSQL = SQL 服务器 2008

嗯,所以有这么大的 table 叫 Clientes。我必须从中获取数据,但它非常庞大,所以我必须分页 trhough

我尝试了 'right way',如文档中所述:

app.use('/clientes', function(req, res){
      var page = req.params.page || 0;
      sequelize.Clientes.findAll({limit: 30, offset: 5  }) 
       .then(function(result) {
      res.json({result: result});
    });
});

它应该可以工作,但它使用的查询类似于

SELECT .......... from [Clientes] as [Clientes] ORDER BY [CNPJ] OFFSET 5 ROWS FETCH NEXT 30 ROWS ONLY; 和 SQL 服务器 return 太糟糕了 Invalid usage of the option NEXT in the FETCH statement!

因此,经过大量搜索后,我发现 FETCH 显然无法与 SQL 2008 一起使用。话虽这么说(令人难过),但我试图将 TDS 版本强制为 7_3_A .我使用

做到了这一点
dialectOptions: {
      tdsVersion: '7_3_A'
},

但是查询语法并没有因此改变:(

我不知道该怎么做了....我什至会使用另一种方式而不是分页...我找到了一个很好的 SQL 分页语法(涉及 row_number()) ,但我无法将其作为对 sequelyze 的原始查询来执行。 myModel.query('SQL QUERY HERE') returned 未定义函数 oO'

任何帮助将不胜感激

好的,经过大量的搜索和调试,我发现了两件事。

1) 由于带有 lodash 的 module.exports,我的续集实例是 sequelize.sequelize。我的错,我不记得了,甚至没有在问题中提到它。对此我感到很抱歉。

2) offsetlimit 确实使用了 fetch,因此为 SQL 2008 生成了无效的 SQL 语法。

我不得不使用 sequelize.sequelize.query() 执行原始查询(因为我的实例是 sequelize.sequelize)。

The query used for pagination in mssql 2008 was found In this answer:

这是我的完整代码,包括查询的快速路由和难看的格式:

var express = require('express')
var app = express();

app.use('/tableName', function(req, res){
    var page = req.params.page || 2;
    var rowsPerPage = req.params.perpage || 30;

    if(rowsPerPage > 100){ 
        rowsPerPage = 100; //this limits how many per page
    }

    var theQuery = 'declare @rowsPerPage as bigint; '+
        'declare @pageNum as bigint;'+
        'set @rowsPerPage='+rowsPerPage+'; '+
        'set @pageNum='+page+';   '+
        'With SQLPaging As   ( '+
        'Select Top(@rowsPerPage * @pageNum) ROW_NUMBER() OVER (ORDER BY ID asc) '+
        'as resultNum, * '+
        'FROM tableName )'+
        'select * from SQLPaging with (nolock) where resultNum > ((@pageNum - 1) * @rowsPerPage);';


    sequelize.sequelize.query(theQuery) 
     .spread(function(result) {
        res.json({result: result});
      });
});

如果你(像我一样)想知道为什么 sequelize.sequelize 而不是 sequelize

好吧,这是因为 var sequelize 是来自文件的 require() module.exports:

 module.exports = lodash.extend({
  sequelize: sequelize, //reffers to new Sequelize(db,user,pass,{});
  Sequelize: Sequelize
 }, db)

所以这就是为什么只返回 sequelize.query() undefined,而 sequelize.sequelize.query() 工作正常,因为实际上我的 sequelize 变量是一个带有 sequelize 属性 是真正的续集连接实例。