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() в памяти. Не идеально, но, по крайней мере, это сработает.