“‘OFFSET’附近的语法不正确”修改 sql comm 2012 至 2008

问题描述 投票:0回答:4

我用这个列出问题

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

sql sql-server sql-server-2008 pagination
4个回答
23
投票

对于使用实体框架(尤其是首先使用数据库)的人来说,如果您使用 SQL 2012 进行开发但部署到早期版本,则可能会发生此错误。

如果您使用 Take...Skip 功能,就会出现此问题,因为 SQL 2012 为此提供了新语法。参见:

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

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


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

3
投票

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


0
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.