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이 오류가 : 키워드 'VIEW'근처 메시지 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 

(또는 더 나은 모두 종료 시작 :

1) 현재 당신이 그런 세미콜론 CTE를 시작해야 나타나는 오류를 해결하려면 대안으로 세미콜론을 사용하는 SQL 문은 더 이상 사용되지 않습니다.

2) 동적 SQL 문자열에 ALTER VIEW 문을 변환하고 일괄 처리의 첫 번째이어야합니다 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

입력 해 주셔서 감사합니다. 두 번째 요점은, PLZ 전화 날 어떻게해야합니까? –

+0

나는 내 대답을 편집하여 당신의 질문에 완전히 대답 해주었습니다. 그러나 Damien_The_Unbeliever가 위의 주석에서 언급 한 것처럼 이것을 실제로 나쁜 행동으로 간주해야합니다. –

+0

고마워요. 천재 야. 그게 아주 도움이되었다. –