0

Как мы можем изменить представление в хранимой процедуре?Alter View in хранимая процедура

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 получаю эту ошибку: Msg 156, Level 15, State 1, процедура createviewupdatepenaltypointsconsecutive, строка 4 Неправильный синтаксис около ключевого слова 'VIEW'. Msg 319, уровень 15, состояние 1, процедура createviewupdatepenaltypointsconsecutive, строка 8 Неверный синтаксис рядом с ключевым словом 'with'. Если этот оператор является общим табличным выражением, предложением xmlnamespaces или предложением контекста отслеживания изменений, предыдущий оператор должен быть прерван точкой с запятой.

+1

Какой смысл повторного создания представления в эта процедура? По-видимому, определение вида никак не изменяется, хранимая процедура не применяет никакой логики и не принимает никаких параметров. –

+0

Проблема, которую я пытаюсь решить, заключается в том, что я помещаю представление в хранимую процедуру. –

ответ

1

Вы не сможете запустить инструкцию ALTER VIEW, как в хранимой процедуре. Таким образом, чтобы решить вашу проблему, то вы должны принять 2 действия:

1) Для того, чтобы исправить ошибку, которая в настоящее время появляется, вы должны начать КТР точкой с запятой, как, что:

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 

(или даже лучше начать прекращение всех ваши SQL-выражения с точкой с запятой в качестве альтернативы устарели).

2) Преобразование альтер утверждение вида в динамической строке SQL и выполнить его с помощью sp_executesql как ALTER VIEW заявление должно быть первым в пакете:

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 tel me, как это сделать? –

+0

Я отредактировал свой ответ, надеюсь, полностью ответит на ваш вопрос. НО, вы действительно должны рассматривать это как плохую практику, поскольку Damien_The_Unbeliever упоминает в комментариях выше. –

+0

Спасибо большое. Ты гений. Это было очень полезно. –

 Смежные вопросы

  • Нет связанных вопросов^_^