【问题标题】:SQL Server 2014 - Incorrect syntax near OFFSETSQL Server 2014 - OFFSET 附近的语法不正确
【发布时间】:2017-01-08 19:30:31
【问题描述】:

我正在使用 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

我在其他帖子中看到,可能会出现错误,因为 OF​​FSET 不在 ORDER BY 之后,但在这种情况下,它在一个 ORDER BY 之后。

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

我还检查了我正在使用的变量是否已声明并且它们都是...

这几乎是让我无法创建程序的唯一错误。如果有人可以提供帮助,我将非常感激!

【问题讨论】:

  • 你说你使用的是SQL Management studio 2014,但是你的数据库也是2014的吗?或者您是否有机会将 2008R2 作为数据库运行?
  • 哦,是的。我刚刚使用了@@version,上面写着 Microsoft SQL Server 2008 R2 (SP2)

标签: sql sql-server tsql stored-procedures offset


【解决方案1】:

经过一番研究,我使用了“SELECT @@version”,发现我的数据库版本是2008,不支持OFFSET。

快速更新到 2012 版解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-04
    • 2014-02-09
    • 2017-07-15
    • 2019-02-04
    相关资源
    最近更新 更多