2016-09-01 72 views
0

我正在使用SQL Server 2014管理工作室,我想創建一個存儲過程,但我有一個問題,在代碼的最後出現錯誤「不正確的語法靠近OFFSET」出現。SQL Server 2014-不正確的語法附近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 

我已經看到了其他職位可能出現的錯誤,因爲ORDER BY之後的偏移量不大,但在這種情況下,它是一個ORDER BY後。

另一件事,我看到的是SQL Server 2008中不支持OFFSET,但我使用2014年

我也檢查了,我使用的變量聲明,他們都是。 ..

它幾乎是使我無法創建過程的唯一錯誤。如果有人能幫助我,我會非常感激!

+4

你說你正在使用SQL Management Studio 2014,但你的數據庫也是2014嗎?或者你有沒有把2008R2作爲數據庫運行? – JanR

+1

哦,是的。我只使用@@版本,它說Microsoft SQL Server 2008 R2(SP2) –

回答

0

經過一番研究,我使用了「SELECT @@ version」,發現我的數據庫版本是2008,它不支持OFFSET。

對版本2012的快速更新解決了該問題。

相關問題