我用这个列出问题
SELECT q.qTitle, q.qDescription, q.qCreatedOn, u.uCode, u.uFullname, qcat.qcatTitle, q.qId, q.qStatus
FROM tblQuestion AS q INNER JOIN tblUser AS u
ON q.uId = u.uId INNER JOIN tblQuestionCategory AS qcat
ON q.qcatId = qcat.qcatId
WHERE (q.qStatus = 1)
ORDER BY q.qCreatedOn DESC
OFFSET @page*10 ROWS FETCH NEXT 10 ROWS ONLY
但是我的服务器有问题,
Incorrect syntax near 'OFFSET'.
Invalid usage of the option NEXT in the FETCH statement.
如何修改 sql server 2008 的查询?
还有一个问题。如何编写列表页面的存储过程?这是我的完整代码http://codepaste.net/gq5n6c
对于使用实体框架(尤其是首先使用数据库)的人来说,如果您使用 SQL 2012 进行开发但部署到早期版本,则可能会发生此错误。
如果您使用 Take...Skip 功能,就会出现此问题,因为 SQL 2012 为此提供了新语法。参见:
http://erikej.blogspot.co.uk/2014/12/a-writing-change-in-entity-framework.html
解决方法是编辑您的 .edmx 文件并将 ProviderManifestToken 值从 2012 年更改为您的数据库版本,例如2008.
从评论中可以看出,错误的原因是SQL Server 2008不支持它。您可以尝试根据SQL Server 2012更改查询。
类似这样的:-
SELECT column1
FROM (
SELECT column1, ROW_NUMBER() OVER (ORDER BY column_id) AS x
FROM mytable
) AS tbl
WHERE tbl.x BETWEEN 20 AND 30
在您的代码中:-
SELECT * FROM
(SELECT ROW_NUMBER() OVER(ORDER BY q.qId) AS rownumber
FROM tblQuestion AS q
INNER JOIN tblUser AS u ON q.uId = u.uId
INNER JOIN tblQuestionCategory AS qcat ON q.qcatId = qcat.qcatId ) as somex
WHERE somex.rownumber BETWEEN 11 AND 20
问题是因为你还没有定义
@page
。
试试这个(因为你没有提到什么是
@page
。我将它视为一些常量,或者你可以声明它,然后为其设置值):-
declare @page int
set @page = 5 // You may set any value here.
SELECT q.qTitle, q.qDescription, q.qCreatedOn, u.uCode,
u.uFullname, qcat.qcatTitle, q.qId, q.qStatus
FROM tblQuestion AS q
INNER JOIN tblUser AS u ON q.uId = u.uId
INNER JOIN tblQuestionCategory AS qcat ON q.qcatId = qcat.qcatId
WHERE (q.qStatus = 1)
ORDER BY q.qCreatedOn DESC
OFFSET (@page*10) ROWS
FETCH NEXT 10 ROWS ONLY
我在使用实体框架时遇到了这个问题。我在一台装有 SQL Server 2012 的机器上进行开发。但部署在一台装有 SQL Server 2008 的机器上。我没有对查询进行跳过和接受,而是对查询执行了 ToList() 并对 ToList 进行了跳过/接受() 内存中。不理想,但至少会起作用。
在具有 Sql Server 多个版本的团队中工作时,模型 Edmx 项目 更改属性:ProviderManifestToken。
我通过将其更改回我的版本解决了该问题。