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

标签 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 并没有因此而改变:(

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

任何帮助将不胜感激

最佳答案

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

1) 我的 sequelize 实例是 sequelize.sequelize ,因为 module.exports 和 lodash。我的错,我不记得了,甚至没有在问题中提到它。我对此感到抱歉。

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 属性是真正的 Sequelize 连接实例。

关于sql-server - 在 SQL 2008 中使用 Sequelize.js 进行分页(不支持 FETCH),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32762168/

相关文章:

python - 将 MSSQL datetime2(7) 值检索为 Python 日期时间,微秒四舍五入而不是截断

sql - 如何在 SSRS 中编写条件以根据值动态更改单元格的颜色

sql - 按日期范围消除行

node.js - 从 localStorage 转换 Backbone 的待办事项列表示例

sql-server - 如何在 SQL Management Studio 中扩展事件文件选项卡名称?

c# - SSIS 2012 - 第二个脚本执行时变量为空

sql - 使用 RAISERROR 指示 ACCESS DENIED 错误

sql - 每 15 分钟更新一次表

Node.js 路径错误

javascript - 通过 Express.js 中的 API 上传文件 : Notification after file upload