web-dev-qa-db-fra.com

"Syntaxe incorrecte près de 'OFFSET'", modifier sql comm 2012 à 2008

Je liste des questions avec cette

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

Mais il y a un problème sur mon serveur, 

Incorrect syntax near 'OFFSET'.
Invalid usage of the option NEXT in the FETCH statement.

Comment puis-je modifier ma requête pour SQL Server 2008?

Une dernière question. Comment écrire une procédure stockée pour lister des pages? Voici mon plein de code http://codepaste.net/gq5n6c

Réponse: http://codepaste.net/jjrkqr

16
Tayfun Yaşar

Comme indiqué dans les commentaires, l'erreur s'explique par le fait que SQL Server 2008 ne la prend pas en charge. Vous pouvez essayer de modifier la requête en fonction de SQL Server 2012.

Quelque chose comme ça:-

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

Dans votre code: -

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

Le problème est dû au fait que vous n'avez pas défini @page.

Essayez ceci (car vous n'avez pas mentionné ce qui est @page. Je le prends comme une constante ou peut-être vous pouvez le déclarer et ensuite en définir la valeur):

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

Pour les personnes utilisant Entity Framework, en particulier la base de données, cette erreur peut se produire si vous développez avec SQL 2012 mais que vous effectuez un déploiement dans une version antérieure. 

Le problème se produira si vous utilisez la fonctionnalité Prendre ... Sauter, car SQL 2012 a une nouvelle syntaxe pour cela. Voir:

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

Le correctif consiste à modifier votre fichier .edmx et à remplacer la valeur de ProviderManifestToken de 2012 par la version de votre base de données, par exemple. 2008.

22
Carl

J'ai rencontré cela lors de l'utilisation de Entity Framework. Je développais sur une machine avec SQL Server 2012. Mais déployé sur une machine avec SQL Server 2008. Au lieu de sauter et d'assumer la requête, j'ai créé une liste ToList () sur celle-ci, puis sautée/reprise. () en mémoire. Pas idéal, mais au moins cela fonctionnera.

4
vbullinger

Lorsque vous travaillez en équipe avec plusieurs versions de Sql Server, le projet modèle Edmx Modifie la propriété: ProviderManifestToken. 

J'ai résolu le problème en le replaçant dans ma version. 

0
Emanuel Bicho