Msgstr "Неправильный синтаксис около 'OFFSET' 'modift 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

Ответы

Ответ 1

Как выяснено в комментариях, причиной ошибки является тот факт, что 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

Для людей, использующих 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.

Ответ 3

Я столкнулся с этим при использовании Entity Framework. Я развивался на машине с SQL Server 2012. Но был развернут на машине с SQL Server 2008. Вместо того, чтобы пропустить и взять запрос, я сделал ToList() в запросе и пропустил/взял этот список ToList() в памяти. Не идеально, но, по крайней мере, это сработает.