SQL 更新

每次部署時需執行的 SQL(DDL / DML / SP)。共 4 個 migration。

2026-05-09 mailqueue-channel
EXEC msdb.dbo.sp_send_dbmail
    @profile_name = N'qq',
    @recipients   = ...,
    @subject      = @subject,
    @body         = @body,
    @body_format  = N'HTML';

INSERT dbo.twork_skd_mailqueue (收件人, 主旨, 內文, 是否HTML, 來源預存程序, 執行guid)
VALUES (@recipients, @subject, @body, 'Y', OBJECT_NAME(@@PROCID), @execguid);

SELECT 狀態, COUNT(*) FROM dbo.twork_skd_mailqueue GROUP BY 狀態;

-- 死信檢視
SELECT pkid, 主旨, 重試次數, 最後錯誤, 來源預存程序
  FROM dbo.twork_skd_mailqueue
 WHERE 狀態 = 'D'
 ORDER BY 建立時間 DESC;
📖 對應 changelog ↗
2026-05-04 skd-sp-split
TWORK_SKD_GET_PENDING_NOTIFYTWORK_SKD_GET_PENDING_AUTOEXEC
-- 1. 建立待通知 SP
CREATE PROCEDURE [dbo].[TWORK_SKD_GET_PENDING_NOTIFY]
    (@datetime datetime)
AS
BEGIN
    SET NOCOUNT ON;
    SELECT *
    FROM dbo.twork_vw_calendarevent
    WHERE 已審核 = 'Y'
      AND 是否停用 <> 'Y'
      AND 通知 = 'Y'
      AND 通知帳號 <> ''
      AND 已通知 <> 'Y'
      AND @datetime >= 通知時間;
END
GO

-- 2. 建立待自動執行 SP
CREATE PROCEDURE [dbo].[TWORK_SKD_GET_PENDING_AUTOEXEC]
    (@datetime datetime)
AS
BEGIN
    SET NOCOUNT ON;
    SELECT TOP 20 *
    FROM twork_vw_calendarevent
    WHERE 已完成 NOT IN ('Y', 'F')
      AND (已完成 <> 'R' OR 執行開始時間 < DATEADD(MINUTE, -10, @datetime))
      AND 已審核 = 'Y'
      AND 是否停用 <> 'Y'
      AND 是否自動執行 = 'Y'
    ORDER BY 預定時間 ASC;
END
GO
📖 對應 changelog ↗
2026-05-03 eventitem-status-r-completion-time
ALTER PROCEDURE [dbo].[TWORK_SKD_UPDATE_EVENT_STATUS]
       @LP_P1 varchar(1),    -- 1 = 已通知, 2 = 已完成
       @LP_P2 varchar(50),   -- pkid
       @LP_P3 varchar(1),    -- 'R' / 'Y' / 'F' / ''
       @LP_P4 varchar(20)    -- yyyy/MM/dd HH:mm:ss 或 ''
   AS
   BEGIN
       SET NOCOUNT ON;
       DECLARE @StartTime datetime = NULL;
       IF @LP_P4 <> ''
           SET @StartTime = CONVERT(datetime, @LP_P4, 111);

       IF @LP_P1 = '1'
           UPDATE [twork_skd_eventitem]
              SET [已通知] = @LP_P3,
                  [執行開始時間] = CASE WHEN @LP_P4 = '' THEN [執行開始時間] ELSE @StartTime END
            WHERE [pkid] = @LP_P2;
       ELSE IF @LP_P1 = '2'
           UPDATE [twork_skd_eventitem]
              SET [已完成] = @LP_P3,
                  [執行開始時間] = CASE WHEN @LP_P4 = '' THEN [執行開始時間] ELSE @StartTime END,
                  [完成時間] = CASE WHEN @LP_P3 = 'Y' THEN GETDATE() ELSE [完成時間] END,
                  [是否停用] = CASE WHEN @LP_P3 = 'Y' THEN 'Y' ELSE '' END
            WHERE [pkid] = @LP_P2;
   END

UPDATE twork_skd_eventitem SET 已完成 = 'R' WHERE 已完成 = 'X';
📖 對應 changelog ↗
2026-05-03 autopilot-task-unify
UPDATE twork_skd_vw_eventtemplated SET 執行方法 = 'CloseBook'     WHERE 執行方法 = '關帳';
UPDATE twork_skd_vw_eventitem      SET 執行方法 = 'CloseBook'     WHERE 執行方法 = '關帳';
UPDATE twork_skd_vw_eventtemplated SET 執行方法 = 'BalanceReport' WHERE 執行方法 = 'CreateBalanceSheet';
UPDATE twork_skd_vw_eventitem      SET 執行方法 = 'BalanceReport' WHERE 執行方法 = 'CreateBalanceSheet';
UPDATE twork_skd_vw_eventtemplated SET 執行方法 = 'PaymntpqQuery' WHERE 執行方法 = 'CreateEmail';
UPDATE twork_skd_vw_eventitem      SET 執行方法 = 'PaymntpqQuery' WHERE 執行方法 = 'CreateEmail';
📖 對應 changelog ↗