0

ストアドプロシージャ内のビューを変更するにはどうすればよいですか?ストアドプロシージャ内のビューの変更

create procedure createviewupdatepenaltypointsconsecutive 
as 
begin 
alter VIEW consecutive 
as 


WITH cte as (
    SELECT *, 
      LAG([pointsRewarded], 1) OVER (PARTITION BY [EmployeeID] ORDER BY [WeekNumber]) as prev1_points, 
      LAG([pointsRewarded], 2) OVER (PARTITION BY [EmployeeID] ORDER BY [WeekNumber]) as prev2_points, 
      LAG([pointsRewarded], 3) OVER (PARTITION BY [EmployeeID] ORDER BY [WeekNumber]) as prev3_points 
    FROM week1 
) 
SELECT *, 
     CASE WHEN [pointsRewarded] = -10 AND prev1_points = -10 AND prev2_points = -10 AND prev3_points = -10 
      THEN -200 
      WHEN [pointsRewarded] = -10 AND prev1_points = -10 AND prev2_points = -10 
      THEN -100 
      WHEN [pointsRewarded] = -10 AND prev1_points = -10 
      THEN -50 
      ELSE 0 
     END penalty  
FROM cte 

end 

このエラーを取得してM: メッセージ156、レベル15、状態1、プロシージャcreateviewupdatepenaltypointsconsecutive、キーワード '表示' に近いライン4 正しくない構文。 メッセージ319、レベル15、状態1、プロシージャcreateviewupdatepenaltointsconsecutive、行8 'with'キーワードの構文が正しくありません。この文が共通テーブル式、xmlnamespaces句または変更追跡コンテキスト句である場合、前の文はセミコロンで終了する必要があります。

+1

再作成ビューのポイントはである何この手続きは?ビューの定義は何らかの形で変更されていないようですが、ストアドプロシージャはロジックを適用したり、パラメータを取り込んでいません。 –

+0

解決しようとしている問題は、ビューをストアドプロシージャに配置する必要があります。 –

答えて

1

ストアドプロシージャのようなALTER VIEWステートメントを実行することはできません。

WITH cte as (
    SELECT *, 
     LAG([pointsRewarded], 1) OVER (PARTITION BY [EmployeeID] ORDER BY [WeekNumber]) as prev1_points, 
     LAG([pointsRewarded], 2) OVER (PARTITION BY [EmployeeID] ORDER BY [WeekNumber]) as prev2_points, 
     LAG([pointsRewarded], 3) OVER (PARTITION BY [EmployeeID] ORDER BY [WeekNumber]) as prev3_points 
FROM week1) 
SELECT *, 
    CASE WHEN [pointsRewarded] = -10 AND prev1_points = -10 AND prev2_points = -10 AND prev3_points = -10 
     THEN -200 
     WHEN [pointsRewarded] = -10 AND prev1_points = -10 AND prev2_points = -10 
     THEN -100 
     WHEN [pointsRewarded] = -10 AND prev1_points = -10 
     THEN -50 
     ELSE 0 
    END penalty  
FROM cte 

(または、より良い、すべて終了開始:現在、あなたがそのようなセミコロンでCTEを開始する必要が表示されるエラーを修正するには

1):だから、あなたは2つのアクションを実行する必要があり、あなたの問題を解決するために代わりにセミコロンを使用したSQL文は推奨されません)。

2)動的SQL文字列であなたのALTER VIEW文を変換し、それがバッチの最初の1でなければなりませんALTER VIEW文としてsp_executesqlを使用して実行します。

CREATE PROCEDURE createviewupdatepenaltypointsconsecutive 
AS 
BEGIN 
    DECLARE @STMT AS NVARCHAR(MAX) = 
    ' 
    ALTER VIEW consecutive 
    AS 


    WITH cte as (
     SELECT *, 
      LAG([pointsRewarded], 1) OVER (PARTITION BY [EmployeeID] ORDER BY [WeekNumber]) as prev1_points, 
      LAG([pointsRewarded], 2) OVER (PARTITION BY [EmployeeID] ORDER BY [WeekNumber]) as prev2_points, 
      LAG([pointsRewarded], 3) OVER (PARTITION BY [EmployeeID] ORDER BY [WeekNumber]) as prev3_points 
     FROM week1 
) 
    SELECT *, 
     CASE WHEN [pointsRewarded] = -10 AND prev1_points = -10 AND prev2_points = -10 AND prev3_points = -10 
       THEN -200 
       WHEN [pointsRewarded] = -10 AND prev1_points = -10 AND prev2_points = -10 
       THEN -100 
       WHEN [pointsRewarded] = -10 AND prev1_points = -10 
       THEN -50 
       ELSE 0 
     END penalty  
    FROM cte 
    ' 
    EXEC sp_executesql @STMT; 
END 
+0

入力していただきありがとうございます.2番目のポイントは、PLZ電話私はどのようにするには? –

+0

私はうまくいけばあなたの質問に完全に答えるために私の答えを編集しました。しかし、Damien_The_Unbelieverが上記のコメントに言及しているように、これを実際に悪い習慣と考えるべきです。 –

+0

ありがとう。あなたの天才。とても役に立ちました。 –

関連する問題