【问题标题】:"Incorrect syntax near 'OFFSET'" modift sql comm 2012 to 2008“'OFFSET'附近的语法不正确”将sql comm 2012修改为2008
【发布时间】:2013-11-06 05:12:29
【问题描述】:

我正在列出与此有关的问题

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

【问题讨论】:

  • 我有一种预感,(@page*10) 可能会解决它。如果没有,请查看文档以查看正式语法。
  • 我刚试了一下,查询工作正常。不过,谷歌搜索该消息会找到一些解决方案。
  • 它工作正常,但现在是 2008 年。2008 年将如何工作?

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


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    在 cmets 中发现错误的原因是 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
    

    【讨论】:

    • 没有。有一个误解。我已经定义了@page。这是完整的代码。 codepaste.net/gq5n6c
    • 这里是 sqlserver 的输出:codepaste.net/cpsdr6 我认为它与 sql server 版本有关。(它的 2010 偏移量无法识别)
    • @tayfun;- 我认为这可能是因为 ORDER BY Clause (Transact-SQL) SQL Server 2008 不支持这种语法。
    • @tayfun:- 检查这个 SQL Fiddle 它对我来说工作正常:- sqlfiddle.com/#!6/10e8f/1
    • @tayfun:- 没搞定。我的意思是这在 SQL SERVER 2008 中不起作用。您必须使您的查询与它兼容
    【解决方案3】:

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

    【讨论】:

    • 当你有这么多记录时,你会讨厌这个解决方案。
    【解决方案4】:

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

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

    【讨论】:

      猜你喜欢
      • 2017-01-08
      • 1970-01-01
      • 2017-07-04
      • 2012-09-11
      • 1970-01-01
      • 2013-12-27
      • 1970-01-01
      • 1970-01-01
      • 2013-03-11
      相关资源
      最近更新 更多