2016-09-01 25 views
0

SQL Server 2014管理スタジオを使用していますが、ストアドプロシージャを作成したいのですが、「OFFSETに近い構文が正しくありません」というエラーが表示されるコードの最後に問題があります。 。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 

私はOFFSET ORDER BYの後ではありませんので、エラーが表示される場合がありますことを、他の記事で見てきたが、この場合にはそれがBY 1 ORDERの後です。私が見た

もう一つは、SQL Server 2008のはOFFSETをサポートしていないということですが、私は2014年

を使用している私も、私が使用している変数が宣言され、それらはすべてがあることを確認しています。 ..

私が手続きを作成するのを妨げている唯一のエラーです。もし誰かが私を助けることができたら、私は非常に幸せになるでしょう

+4

あなたはSQL Management Studio 2014を使用していますが、2014年もデータベースですか?または2008R2をデータベースとして実行していますか? – JanR

+1

ああそうです。私は@@ versionを使用しましたが、Microsoft SQL Server 2008 R2(SP2) –

答えて

0

少しの調査の後、私は "SELECT @@ version"を使用し、データベースバージョンが2008年であり、これはOFFSETをサポートしていないことがわかりました。

バージョン2012のクイックアップデートにより、この問題が解決されました。

関連する問題