Paginer avec Sequelize.js à SQL 2008 (qui ne supporte pas FETCH)

Donc, j'utilise sequelize.js avec tedious pour le support de mssql. MSSQL = SQL Server 2008

Eh bien, il y a donc cette grande table nommée Clientes. Je dois aller chercher des données, mais c'est assez énorme, donc je vais devoir paginer

J'ai essayé la «bonne manière», comme dans les docs:

 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}); }); }); 

Ça devrait marcher, MAIS ça utilise une requête qui est quelque chose comme

SELECT .......... from [Clientes] as [Clientes] ORDER BY [CNPJ] OFFSET 5 ROWS FETCH NEXT 30 ROWS ONLY; et le SQL Server renvoient une terrible Invalid usage of the option NEXT in the FETCH statement !

Donc, après beaucoup de search, je suis arrivé à un point où apparemment FETCH ne fonctionnera pas avec SQL 2008. Cela étant dit (et sortingste) j'ai essayé de forcer la version TDS à 7_3_A. Je l'ai fait en utilisant

 dialectOptions: { tdsVersion: '7_3_A' }, 

mais la requête sintax n'a pas changé avec ceci 🙁

Je ne sais plus quoi faire … Je vais même utiliser une autre façon au lieu de paginer … J'ai trouvé une belle sintaxie à la pagination SQL (impliquant row_number() ), mais je n'ai pas pu l'exécuter en tant que requête brute sur sequelyze. myModel.query('SQL QUERY HERE') renvoyé la fonction non définie oO '

Toute aide sera appréciée

Ok, donc après beaucoup de search et de debugging, j'ai trouvé 2 choses.

1) Mon instance sequelize était sequelize.sequelize , en raison d'un module.exports avec lodash. Mon mauvais, je ne m'en souviens pas, et ne l'ai même pas mentionné dans la question. Je suis désolé pour ça.

2) L' offset et la limit utilisent fetch et génèrent donc une syntaxe SQL invalide pour SQL 2008.

J'ai dû effectuer une requête brute, en utilisant sequelize.sequelize.query() (puisque mon instance était sequelize.sequelize).

La requête utilisée pour la pagination dans mssql 2008 a été trouvée dans cette réponse :

voici mon code complet, y compris le routing express et le format moche pour la requête:

 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}); }); }); 

Et si vous (comme je l'ai fait) se requestr pourquoi sequelize.sequelize au lieu de se sequelize seulement?

Eh bien, c'est parce que var sequelize est un require() d'un file avec le module.exports suivant:

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

C'est pourquoi juste sequelize.query() été renvoyé undefined , et sequelize.sequelize.query() fonctionne bien, car en vrai ma variable sequelize est un object avec la propriété sequelize étant la véritable instance de connection sequelize.