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;
よろしく、 ケン...
私はあなたのコードが動作すると、あなたがupvoteを得たが、私はあなたがセミコロンでCTEを開始すべきであることを反対することに同意:以下は動作するはずの変更があります。セミコロンは、ステートメントのターミネータであり、ステートメントのbeginninatorではありません。また、BEGIN/ENDはプロシージャーには必要ありません。最初のcteはセミコロンを必要とせず、2番目のセミコロンは現在2つあります。 –
この場合、私は 'BEGIN' /' END'に同意しません。 'BEGIN ... END'を使わずに' CTE'で始まるプロシージャーを作成しようとすると、 'CTE'名が認識されないようにするために'; 'の前に'; 'がなく、(' ';'は存在します) '不正な構文が近くにあります; ';'エラー。この特定の場合、 'AS BEGIN ... END'が必要です。 – Siyual
これは当てはまりません。 BEGIN/ENDなしでプロシージャを作成することができます。最初の行はcteでセミコロンはまったく問題ありません。前の行がセミコロンで終わっていることを忘れないでください。ここでこれを見てください。 http://sqlfiddle.com/#!6/35eb7/1 –