将 IF BEGIN END 与 CTE 结合使用:关键字“End”附近的语法不正确
Using IF BEGIN END with CTE: Incorrect syntax near the keyword `End`
发帖前检查了几个问题,还是不能确定下面代码的语法有什么问题? 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 定义完成,您必须 Select/Delete/Update 从 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
块可能会导致参数嗅探
发帖前检查了几个问题,还是不能确定下面代码的语法有什么问题? 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 定义完成,您必须 Select/Delete/Update 从 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
块可能会导致参数嗅探