所以,我使用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'
任何帮助将不胜感激
答案 0 :(得分:1)
好的,经过大量的搜索和调试,我找到了两件事。
1)我的续集实例是sequelize.sequelize
,因为module.exports
使用了lodash。我的坏,我不记得了,甚至没有在问题中提到它。对此我很抱歉。
2)offset
和limit
确实使用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()
undefined
,sequelize.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连接实例。