2017-07-01 7 views
2
WITH TBL AS 
(
    SELECT * FROM OUTPUT WHERE PRODUCT_ID = 5 
    UNION ALL 
    SELECT O.PRODUCT_ID,O.PRODUCT_NAME,O.PARENT_ID,O.PARENT_PRODUCT_NAME 
    FROM OUTPUT O 
    JOIN TBL T1 ON O.PRODUCT_ID = T1.PARENT_ID 
) 
SELECT * FROM TBL 
WHERE PRODUCT_ID <> 5 
OPTION(MAXRECURSION 1000); 

上記のコードを実行すると、エラー文「SQLコマンドが正しく終了しません」が表示されます。私を案内してください。再帰を実装するときにSQLコマンドが正しく終了しなかったエラー

答えて

0

あなたのクエリは問題ありません。 HereはRexTesterのほぼ同じクエリの例です。

エラーが発生した場合は、おそらくこのコードの前にコードがあります。これによりエラーが発生します。セミコロンの使用は、後のコードでの問題を防ぎます。

最初に、再帰句は明示的に列をリストする必要があります。 select *select <column list>を使用せず、2つが一致することを期待しないでください。だから、列をリスト:

WITH TBL AS (
     SELECT O.PRODUCT_ID, O.PRODUCT_NAME, O.PARENT_ID, O.PARENT_PRODUCT_NAME 
     FROM OUTPUT O 
     WHERE PRODUCT_ID = 5 
     UNION ALL 
     SELECT O.PRODUCT_ID, O.PRODUCT_NAME, O.PARENT_ID, O.PARENT_PRODUCT_NAME 
     FROM OUTPUT O JOIN 
      TBL T1 
      ON O.PRODUCT_ID = T1.PARENT_ID 
    ) 

第二に、あなたは自分の名前でPARENT_PRODUCT_NAMEを持つべきではありません。あなたはPARENT_IDです。これを使用して名前を検索します。

-1

CTE定義では、正しくコンパイルするには前のステートメントが終了する必要があります。だからあなたのコードはMicrosoft T-SQL documentationから

; --you were missing this 
WITH TBL AS 
(
    SELECT * FROM OUTPUT WHERE PRODUCT_ID = 5 
    UNION ALL 
    SELECT O.PRODUCT_ID,O.PRODUCT_NAME,O.PARENT_ID,O.PARENT_PRODUCT_NAME 
    FROM OUTPUT O 
    JOIN TBL T1 ON O.PRODUCT_ID = T1.PARENT_ID 
) 
SELECT * FROM TBL 
WHERE PRODUCT_ID <> 5 
OPTION(MAXRECURSION 1000); 
0

のようにする必要があります:CTEは、バッチの一部である文で使用される場合

、その前の文では、セミコロンを続けなければなりません。

WITHの前のステートメント/セミコロンの後にセミコロン(;)を追加します。 WITHステートメントの前にセミコロンを付けることをお勧めします。

関連する問題