sql >> Database >  >> RDS >> Sqlserver

Weergave wijzigen binnen opgeslagen procedure

U kunt de ALTER VIEW . niet uitvoeren dergelijke verklaring in uw opgeslagen procedure. Dus om uw probleem op te lossen, moet u 2 acties ondernemen:

1) Om de fout die momenteel verschijnt te corrigeren, moet u de CTE beginnen met een puntkomma als volgt:

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

(Of nog beter, begin al uw SQL-statements te beëindigen met puntkomma's, aangezien het alternatief verouderd is).

2) Converteer uw alter view-statement naar een dynamische SQL-string en voer het uit met sp_executesql als de ALTER VIEW statement moet de eerste in de batch zijn:

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. Hoe te zoeken naar een volledige naam wanneer voornaam en achternaam in verschillende kolommen zijn opgeslagen?

  2. MySQL:invoegen waar niet bestaat

  3. Hoe kan ik een volledige tabelscan op deze mysql-query vermijden?

  4. Werk alle rijen in de database bij met een hash-waarde