2013-10-27 2 views
15

я перечисляю вопросы с этим"Неправильный синтаксис около" OFFSET" modift SQL Прдч 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

+0

У меня есть догадка, что '(@ page * 10)' может решить проблему. Если нет, просмотрите документы, чтобы увидеть формальный синтаксис. – usr

+0

Я просто попробовал, и запрос работает нормально. Однако при запуске сообщения появляются некоторые решения. – usr

+0

работает отлично, но теперь в 2008 году. Как он будет работать в 2008 году? – tayfun

ответ

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 
+0

нет нет. есть недоразумение. Я уже определил @page. здесь полный код. http://codepaste.net/gq5n6c – tayfun

+0

@tayfun: - Я обновил свой ответ. Не могли бы вы сейчас попробовать? –

+0

здесь выведено из sqlserver: http://codepaste.net/cpsdr6 Я думаю, что это о версии сервера sql. (Его 2010 OFFSET не распознан) – tayfun

4

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

+2

Вы будете ненавидеть это решение, если у вас так много записей. –

20

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

+0

работал автоматически – user2475096

Смежные вопросы