“'OFFSET'附近的语法不正确”修改了2012年到2008年的sql comm

时间:2013-10-27 11:48:39

标签: sql sql-server sql-server-2008 paging

我正在列出这个问题

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 个答案:

答案 0 :(得分:22)

对于首先使用Entity Framework,特别是数据库的用户,如果使用SQL 2012进行开发但部署到早期版本,则会发生此错误。

如果使用Take ... Skip功能,则会出现问题,因为SQL 2012有一个新的语法。参见:

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

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

答案 1 :(得分: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

答案 2 :(得分:4)

我在使用Entity Framework时遇到过这种情况。我在使用SQL Server 2012的计算机上进行开发。但是部署在具有SQL Server 2008的计算机上。我没有跳过并接受查询,而是对查询执行了ToList()并对该ToList进行了跳过/取消() 在记忆中。不理想,但至少它会起作用。

答案 3 :(得分:0)

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

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