2016-05-08 5 views
1

投稿する前にいくつかの質問を確認しましたが、次のコードの構文に間違いがないかどうかを判断できませんでしたか? ENDの両方で同じエラーが表示されます。ありがとう! ASすぐにCTEの定義は、あなたはそれが有効な構文ではありません、他のCTEから/削除/更新を選択しなければなりません終えるようCTEでIF BEGIN ENDを使用しています:キーワード「End」の近くの構文が正しくありません

WITH CTE (Col1, col2, col3,...) --<-- Column names optional 
AS 
(

    -- CTE's Definition 
) 
Select/Delete/Update 
FROM 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 
    ) 
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 [email protected] AND GroupId IN (SELECT GroupId FROM GroupDiscussionRegistrations WHERE [email protected]) 
       ) 
    ) 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 
+0

をスニッフィングパラメータにつながる可能性が... – mxix

答えて

1

あなたは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_NUMBERdecimal値を生成しないで必要とされていないROW_NUMBERためCastを削除します。

あなたの現在のIF/ELSEブロックが各CTEの後にクエリの残りの部分を追加

1

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 [email protected] 
         AND GroupId IN (SELECT GroupId 
             FROM GroupDiscussionRegistrations 
             WHERE [email protected]) 
       ) 
    ) 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 
関連する問題