web-dev-qa-db-ja.com

「 'OFFSET'付近の構文が正しくありません」sql comm 2012から2008に変更

私はこれで質問をリストしています

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

16
Tayfun Yaşar

コメントでわかるように、エラーの理由は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
14
Rahul Tripathi

Entity Framework、特にデータベースを最初に使用している場合、SQL 2012を使用して開発し、以前のバージョンにデプロイすると、このエラーが発生する可能性があります。

SQL 2012には新しい構文があるため、Take ... Skip機能を使用すると問題が発生します。見る:

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

修正は、.edmxファイルを編集して、ProviderManifestToken値を2012からデータベースバージョンに変更することです。 2008年.

22
Carl Sharman

Entity Frameworkを使用しているときにこれに遭遇しました。私はSQL Server 2012を備えたマシンで開発していましたが、SQL Server 2008を備えたマシンにデプロイしました。スキップしてクエリを実行する代わりに、クエリでToList()を実行し、そのToListをスキップ/テイクしました()メモリ内。理想的ではありませんが、少なくとも機能します。

4
vbullinger

Sql Serverに複数のバージョンがあるチームで作業する場合、モデルEdmxプロジェクトはプロパティを変更します:ProviderManifestToken。

私のバージョンに戻すことで問題を解決しました。

0
Emanuel Bicho