2016-05-19 20 views
1

別のスレッドのヘルプを使用してビルドしたこのクエリをテストしたところ、ストアドプロシージャに移動してパラメータ(EIDの値)を入力する必要がありました。ですから、完全にテストされたクエリに対して唯一行った変更は、@ param1パラメータを上部と下部に追加し、プロシージャ行を上部に作成することです。CTEによるストアドプロシージャの作成に失敗しました

SQL80001: 'n'は認識されていないオプションで、4行目で窒息しているため保存できません。

この時点までには長い道のりだった。誰かがここでフィニッシュラインを押してくれたら助かりますか?

CREATE PROCEDURE [dbo].[UpdateSubIdx] 
@param1 varchar(30) 

WITH n AS 
(
SELECT DID AS DID, 
     sub_idx AS current_id, 
     ROW_NUMBER() OVER (PARTITION BY EID ORDER BY alt_sub_idx) AS new_id 
FROM GETT_Documents 
) 
--SELECT * FROM N 
UPDATE GETT_Documents 
     SET sub_idx = n.new_id 
FROM GETT_Documents G 
JOIN n ON N.DID = G.DID 
WHERE EID = 'AC-1.1.i'; 

---Repeat for the alt sub idx column renumberation 
WITH n AS 
(
SELECT DID AS DID, 
     alt_sub_idx AS current_id, 
ROW_NUMBER() OVER (PARTITION BY EID ORDER BY sub_idx)*10 AS new_id 
    FROM GETT_Documents 
) 

UPDATE GETT_Documents 
     SET alt_sub_idx = n.new_id 
FROM GETT_Documents G 
JOIN n ON N.DID = G.DID 
WHERE EID = @param1; 

よろしく、 ケン...

答えて

3

あなたは、前の文を終了するため、すぐにWITHキーワードの前にセミコロン(;)を配置する必要があります。

共通テーブル式は;を付ける必要があります - これについての詳細はここで読むことができます:Why should a CTE start with a semi-colon?

をまた、手続きの体をマークするAS BEGIN ... ENDを使用する必要があります。

CREATE PROCEDURE [dbo].[UpdateSubIdx] @param1 varchar(30) 
As Begin 

    ;WITH n AS 
    (
    SELECT DID AS DID, 
      sub_idx AS current_id, 
      ROW_NUMBER() OVER (PARTITION BY EID ORDER BY alt_sub_idx) AS new_id 
    FROM GETT_Documents 
    ) 
    --SELECT * FROM N 
    UPDATE GETT_Documents 
      SET sub_idx = n.new_id 
    FROM GETT_Documents G 
    JOIN n ON N.DID = G.DID 
    WHERE EID = 'AC-1.1.i'; 

    ---Repeat for the alt sub idx column renumberation 
    ;WITH n AS 
    (
    SELECT DID AS DID, 
      alt_sub_idx AS current_id, 
    ROW_NUMBER() OVER (PARTITION BY EID ORDER BY sub_idx)*10 AS new_id 
     FROM GETT_Documents 
    ) 

    UPDATE GETT_Documents 
      SET alt_sub_idx = n.new_id 
    FROM GETT_Documents G 
    JOIN n ON N.DID = G.DID 
    WHERE EID = @param1; 
End 
+1

私はあなたのコードが動作すると、あなたがupvoteを得たが、私はあなたがセミコロンでCTEを開始すべきであることを反対することに同意:以下は動作するはずの変更があります。セミコロンは、ステートメントのターミネータであり、ステートメントのbeginninatorではありません。また、BEGIN/ENDはプロシージャーには必要ありません。最初のcteはセミコロンを必要とせず、2番目のセミコロンは現在2つあります。 –

+0

この場合、私は 'BEGIN' /' END'に同意しません。 'BEGIN ... END'を使わずに' CTE'で始まるプロシージャーを作成しようとすると、 'CTE'名が認識されないようにするために'; 'の前に'; 'がなく、(' ';'は存在します) '不正な構文が近くにあります; ';'エラー。この特定の場合、 'AS BEGIN ... END'が必要です。 – Siyual

+0

これは当てはまりません。 BEGIN/ENDなしでプロシージャを作成することができます。最初の行はcteでセミコロンはまったく問題ありません。前の行がセミコロンで終わっていることを忘れないでください。ここでこれを見てください。 http://sqlfiddle.com/#!6/35eb7/1 –

関連する問題