Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Zmień widok w ramach procedury składowanej

Nie będziesz w stanie uruchomić ALTER VIEW takie oświadczenie w procedurze składowanej. Aby rozwiązać swój problem, musisz podjąć 2 działania:

1) Aby poprawić aktualnie pojawiający się błąd, musisz rozpocząć CTE od takiego średnika:

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

(Lub jeszcze lepiej zacznij kończenie wszystkich instrukcji SQL średnikiem, ponieważ alternatywa jest przestarzała).

2) Przekonwertuj swoją instrukcję alter view w dynamiczny ciąg SQL i wykonaj ją za pomocą sp_executesql jako ALTER VIEW oświadczenie musi być pierwszym w partii:

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Użyj TYPEPROPERTY(), aby zwrócić informacje o typie danych w SQL Server

  2. SQL Server zmienia czcionkę w ciągu html

  3. Połącz więcej niż dwie tabele poziomo w SQL Server

  4. Konwertuj „smalldatetime” na „time” w SQL Server (przykłady T-SQL)

  5. Lista funkcji daty i czasu w SQL Server (T-SQL)