在发布之前,我已经检查了几个问题,但仍然无法确定以下代码的语法有什么问题?我收到两个END
的相同错误。谢谢
IF @UserId =''
BEGIN
;WITH cte AS (
SELECT * FROM (
SELECT [EntryId],
CAST(ROW_NUMBER() OVER (ORDER BY Date DESC) AS INT) AS RN_PARENT,
0 AS RN_CHILD
FROM Entries
WHERE [EntryDepthness] = 0 AND DiscussionWallId = @DiscussionWallId
) AS Main
WHERE ((RN_PARENT BETWEEN(@PageIndex -1) * (@PageSize) + 1 AND (((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1))
UNION ALL
SELECT e.[EntryId],
0 AS RN_PARENT,
CAST(ROW_NUMBER() OVER (ORDER BY e.Date DESC) AS INT) AS RN_CHILD
FROM Entries e
INNER JOIN cte v ON v.EntryId = e.ParentEntryId
WHERE e.EntryDepthness = 1
)
END
ELSE
BEGIN
;WITH cte AS (
SELECT * FROM (
SELECT [EntryId],
CAST(ROW_NUMBER() OVER (ORDER BY Date DESC) AS INT) AS RN_PARENT,
0 AS RN_CHILD
FROM Entries
WHERE [EntryDepthness] = 0 AND DiscussionWallId = @DiscussionWallId AND
UserId IN (
SELECT UserId FROM GroupStudentAssignments
WHERE MemberId=@UserId AND GroupId IN (SELECT GroupId FROM GroupDiscussionRegistrations WHERE DiscussionWallId=@DiscussionWallId)
)
) AS Main
WHERE ((RN_PARENT BETWEEN(@PageIndex -1) * (@PageSize) + 1 AND (((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1))
UNION ALL
SELECT e.[EntryId],
0 AS RN_PARENT,
CAST(ROW_NUMBER() OVER (ORDER BY e.Date DESC) AS INT) AS RN_CHILD
FROM Entries e
INNER JOIN cte v ON v.EntryId = e.ParentEntryId
WHERE e.EntryDepthness = 1
)
END
CTE的语法如下
WITH CTE (Col1, col2, col3,...) --<-- Column names optional
AS
(
-- CTE's Definition
)
Select/Delete/Update
FROM CTE
cte的定义完成后,必须立即从cte中选择/删除/更新,否则它不是有效的语法。
在您的查询中,在定义CTE之前,您已经做了所有事情,但没有对它们做任何事情。。。
类似。。。。。
IF @UserId =''
BEGIN
;WITH cte AS (
SELECT * FROM (
SELECT [EntryId],
CAST(ROW_NUMBER() OVER (ORDER BY Date DESC) AS INT) AS RN_PARENT,
0 AS RN_CHILD
FROM Entries
WHERE [EntryDepthness] = 0 AND DiscussionWallId = @DiscussionWallId
) AS Main
WHERE ((RN_PARENT BETWEEN(@PageIndex -1) * (@PageSize) + 1
AND (((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1))
UNION ALL
SELECT e.[EntryId],
0 AS RN_PARENT,
CAST(ROW_NUMBER() OVER (ORDER BY e.Date DESC) AS INT) AS RN_CHILD
FROM Entries e
INNER JOIN cte v ON v.EntryId = e.ParentEntryId
WHERE e.EntryDepthness = 1
)
select * from cte --<-- maybe a select statment here
END
ELSE
BEGIN
;WITH cte AS (
SELECT * FROM (
SELECT [EntryId],
CAST(ROW_NUMBER() OVER (ORDER BY Date DESC) AS INT) AS RN_PARENT,
0 AS RN_CHILD
FROM Entries
WHERE [EntryDepthness] = 0 AND DiscussionWallId = @DiscussionWallId AND
UserId IN (
SELECT UserId FROM GroupStudentAssignments
WHERE MemberId=@UserId
AND GroupId IN (SELECT GroupId
FROM GroupDiscussionRegistrations
WHERE DiscussionWallId=@DiscussionWallId)
)
) AS Main
WHERE ((RN_PARENT BETWEEN(@PageIndex -1) * (@PageSize) + 1
AND (((@PageIndex -1) * @PageSize + 1) + @PageSize) - 1))
UNION ALL
SELECT e.[EntryId],
0 AS RN_PARENT,
CAST(ROW_NUMBER() OVER (ORDER BY e.Date DESC) AS INT) AS RN_CHILD
FROM Entries e
INNER JOIN cte v ON v.EntryId = e.ParentEntryId
WHERE e.EntryDepthness = 1
)
select * from cte --<-- and maybe a select statment here
END
您不需要IF/ELSE
块来执行此操作。
您所需要的只是另一个OR
条件来检查@UserId =''
。试试这个方法。
;WITH cte
AS (SELECT *
FROM (SELECT [entryid],
Row_number() OVER (ORDER BY date DESC) AS RN_PARENT,
0 AS RN_CHILD
FROM entries
WHERE [entrydepthness] = 0
AND discussionwallid = @DiscussionWallId
AND ( userid IN (SELECT userid
FROM groupstudentassignments
WHERE memberid = @UserId
AND groupid IN (SELECT groupid FROM groupdiscussionregistrations
WHERE discussionwallid = @DiscussionWallId)
) OR @UserId = '' )) AS Main --Here
WHERE (( rn_parent BETWEEN( @PageIndex - 1 ) * ( @PageSize ) + 1
AND ( ( ( @PageIndex - 1 ) * @PageSize + 1 ) + @PageSize ) - 1 ))
UNION ALL
SELECT e.[entryid],
0 AS RN_PARENT,
Row_number() OVER (ORDER BY e.date DESC) AS RN_CHILD
FROM entries e
INNER JOIN cte v
ON v.entryid = e.parententryid
WHERE e.entrydepthness = 1)
SELECT *
FROM cte
还为根本不需要的ROW_NUMBER
移除Cast
。ROW_NUMBER
不生成decimal
值。
您当前的IF/ELSE
块可能会导致参数嗅探