2016-09-01 1 views
0

Ich benutze SQL Server 2014 Management Studio und ich wollte eine gespeicherte Prozedur erstellen, aber ich habe ein Problem am Ende des Codes, wo der Fehler "Falsche Syntax in der Nähe von OFFSET" erscheint .SQL Server 2014 - Falsche Syntax in der Nähe von OFFSET

CREATE PROCEDURE [dbo].[GetGamesPlayed] 
    @gameSession int, 
    @datestart datetime, 
    @dateend datetime, 
    @orderBy nvarchar(50) = 'email', 
    @sortOrder nvarchar(4) = 'asc', 
    @search nvarchar(50) = '', 
    @startRow int = 0, 
    @rows int = 2147483647 
AS 
BEGIN 
    SET NOCOUNT ON; 

    SELECT t.*, 
      COUNT(*) OVER() AS filteredRows, 
      (SELECT COUNT(id) FROM gameplayed WHERE gameplayed.id_GameSession = @gameSession) AS totalRows 
    FROM (SELECT 
      DISTINCT GamesTable.[Game ID], 
      GamesTable.[Rep Id], 
      GamesTable.[User Id], 
      GamesTable.[Date], 
      GamesTable.[Email], 
      GamesTable.[Name], 
      GamesTable.[Phone Number], 
      GamesTable.[Tokens Played], 
      CASE 
       WHEN prizewon.pending = 1 THEN 'Pending' 
       WHEN prizewon.skillTestingQCorrect = 1 AND prizewon.rulesAccepted = 1 THEN 'Yes' 
       ELSE 'No' 
      END AS [Won] 

      FROM PrizeWon 
       RIGHT OUTER JOIN (
        SELECT 
         GamePlayed.id AS [Game ID], 
         GamePlayed.playedOn AS [Date], 
         users.repId AS [Rep Id], 
         users.id AS [User Id], 
         users.fullName AS [Name], 
         users.email AS [Email], 
         users.phoneNumber AS [Phone Number], 
         GamePlayed.tokensPlayed AS [Tokens Played] 

        FROM GamePlayed 
          INNER JOIN Users on GamePlayed.id_Users = Users.id 

        WHERE GamePlayed.id_GameSession = @gameSession) AS GamesTable ON GamesTable.[Game ID] = prizewon.id_GamePlayed 

    WHERE GamesTable.Date >= @datestart 
      AND GamesTable.Date <= @dateend 
      AND ( GamesTable.[Email] LIKE '%' + @search + '%' 
       OR GamesTable.[Rep Id] LIKE '%' + @search + '%' 
       OR GamesTable.[Name] LIKE '%' + @search + '%' 
       OR GamesTable.[Game ID] LIKE '%' + @search + '%' 
       ) 
     ) t 


--order by cases must be split into datatypes  
ORDER BY 
    CASE WHEN @sortOrder = 'asc' THEN 
     CASE @orderBy -- nvarchar 
      WHEN 'repid' THEN t.[Rep Id] 
      WHEN 'name' THEN t.[Name] 
      WHEN 'email' THEN t.[Email] 
      WHEN 'phone' THEN t.[Phone Number] 
      WHEN 'won' THEN t.Won 
     END 
    END ASC, 
    CASE WHEN @sortOrder = 'asc' THEN 
     CASE @orderBy --date 
      WHEN 'date' THEN t.Date 
     END 
    END ASC, 
    CASE WHEN @sortOrder = 'asc' THEN 
     CASE @orderBy --int 
      WHEN 'id' THEN t.[Game ID] 
      WHEN 'tokens' THEN t.[Tokens Played] 
     END 
    END ASC, 
    CASE WHEN @sortOrder = 'desc' THEN 
     CASE @orderBy -- nvarchar 
      WHEN 'repid' THEN t.[Rep Id] 
      WHEN 'name' THEN t.[Name] 
      WHEN 'email' THEN t.[Email] 
      WHEN 'phone' THEN t.[Phone Number] 
      WHEN 'won' THEN t.Won 
     END 
    END DESC, 
    CASE WHEN @sortOrder = 'desc' THEN 
     CASE @orderBy --date 
      WHEN 'date' THEN t.Date 
     END 
    END DESC, 
    CASE WHEN @sortOrder = 'desc' THEN 
     CASE @orderBy --int 
      WHEN 'id' THEN t.[Game ID] 
      WHEN 'tokens' THEN t.[Tokens Played] 
     END 
    END DESC 

    OFFSET @startRow ROWS FETCH NEXT @rows ROWS ONLY 
END 

Ich habe in anderen Beiträgen zu sehen, dass der Fehler auftreten kann, weil die nicht nach einem ORDER BY-OFFSET ist, aber in diesem Fall ist es nach einer ORDER BY.

Eine andere Sache, die ich sah, dass SQL Server 2008 nicht OFFSET unterstützen, aber ich bin 2014

mit Ich habe überprüft auch, dass die Variablen, die ich verwende deklariert und sie alle sind. ..

Es ist so ziemlich der einzige Fehler, der mich davon abhält, die Prozedur zu erstellen. Wenn jemand helfen könnte, wäre ich sehr dankbar!

+4

Sie sagen, Sie verwenden SQL Management Studio 2014, aber ist Ihre Datenbank auch 2014? Oder laufen Sie 2008R2 als Datenbank? – JanR

+1

Oh ja. Ich habe gerade @@ Version verwendet und es sagt Microsoft SQL Server 2008 R2 (SP2) –

Antwort

0

Nach ein wenig Recherche habe ich "SELECT @@ version" verwendet und festgestellt, dass meine Datenbankversion 2008 war, die OFFSET nicht unterstützt.

Ein kurzes Update auf Version 2012 löste das Problem.

Verwandte Themen