【发布时间】: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
我在其他帖子中看到,可能会出现错误,因为 OFFSET 不在 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