Sqlserver
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Sqlserver

Chế độ xem thay thế trong quy trình được lưu trữ

Bạn sẽ không thể chạy ALTER VIEW tuyên bố như vậy trong thủ tục được lưu trữ của bạn. Vì vậy, để giải quyết vấn đề của bạn, bạn phải thực hiện 2 hành động:

1) Để sửa lỗi hiện đang xuất hiện, bạn phải bắt đầu CTE bằng dấu chấm phẩy như sau:

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

(Hoặc thậm chí tốt hơn là bắt đầu chấm dứt tất cả các Câu lệnh SQL của bạn bằng dấu chấm phẩy vì giải pháp thay thế không được dùng nữa).

2) Chuyển đổi câu lệnh dạng xem thay thế của bạn trong một chuỗi SQL động và thực thi nó bằng cách sử dụng sp_executesql dưới dạng ALTER VIEW câu lệnh phải là câu lệnh đầu tiên trong lô:

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. Cách chèn vào bảng tạm thời thông tin được cung cấp bởi RESTORE FILELISTONLY / HEADERONLY / VERIFYONLY

  2. Cách sys.dm_exec_describe_first_result_set_for_object hoạt động trong SQL Server

  3. Lỗi máy chủ SQL 109:Có nhiều cột trong câu lệnh INSERT hơn giá trị được chỉ định trong mệnh đề VALUES

  4. Lệnh SUBSTRING trong SQL:A Primer

  5. SQL Server 2017:Sao chép dữ liệu SQL Server từ Linux sang Windows bằng SSIS