17

我列出了这个问题

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

答案:http ://codepaste.net/jjrkqr

4

4 回答 4

23

对于使用实体框架的人,特别是首先使用数据库的人,如果您使用 SQL 2012 开发但部署到早期版本,则可能会出现此错误。

如果您使用 Take...Skip 功能,则会出现问题,因为 SQL 2012 对此有新的语法。看:

http://erikej.blogspot.co.uk/2014/12/a-break-change-in-entity-framework.html

修复方法是编辑您的 .edmx 文件并将 ProviderManifestToken 值从 2012 更改为您的数据库版本,例如 2008。

于 2015-11-20T16:12:07.627 回答
14

正如在评论中发现的错误原因是因为 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
于 2013-10-27T11:55:55.957 回答
3

我在使用实体框架时遇到了这个问题。我正在使用 SQL Server 2012 的机器上进行开发。但部署在使用 SQL Server 2008 的机器上。我没有跳过并接受查询,而是对查询执行了 ToList() 并对 ToList 进行了跳过/接受() 在记忆中。不理想,但至少它会起作用。

于 2015-07-31T21:46:44.997 回答
0

在使用 Sql Server 的多个版本的团队中工作时,模型 Edmx 项目会更改属性:ProviderManifestToken。

我通过将其更改回我的版本来解决问题。

于 2018-07-28T16:07:06.027 回答