我正在列出这个问题
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
答案 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。
我通过将其更改回我的版本来解决该问题。