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

时间:2015-09-24 13:06:25

标签: sql-server sql-server-2008 express pagination sequelize.js

所以,我使用sequelize.js和tedious来支持mssql。 MSSQL = SQL Server 2008

嗯,所以有一个名为Clientes的大桌子。我必须从中获取数据,但它非常庞大,因此我必须对其进行分页

我尝试了正确的方式',如文档中所述:

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 Server返回一个可怕的Invalid usage of the option NEXT in the FETCH statement

所以,经过大量的搜索,我得到了一点,显然FETCH将不能与SQL 2008一起使用。这就是说(而且很难过)我试图将TDS版本强制为7_3_A。我是用

做的
dialectOptions: {
      tdsVersion: '7_3_A'
},

但查询sintax没有改变:(

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

任何帮助将不胜感激

1 个答案:

答案 0 :(得分:1)

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

1)我的续集实例是sequelize.sequelize,因为module.exports使用了lodash。我的坏,我不记得了,甚至没有在问题中提到它。对此我很抱歉。

2)offsetlimit确实使用fetch,从而为SQL 2008生成无效的SQL sintax。

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

  

在mssql 2008中用于分页的查询被发现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() undefinedsequelize.sequelize.query()正常工作的原因,因为在sequelize变量中,sequelize变量是jQuery.validator.addMethod('COMP_WORD', function (value, element, param) { return RegExp( '\\b' + param + '\\b', 'i').test(value); }, "Must contain the word PARAMETER_VAL in CAPS"); 的对象property是真正的sequelize连接实例。