2017-10-21 193 views
1

我創建了一個SQL Server觸發器,當他的一個病人改變狀態爲「殺死」時,應該爲醫生添加一個殺手。但我不知道如何獲得更新的那一行。從現在看來,醫生對於他以前曾經患過的每一位患者都會有耐心的++。SQL Server:如何更新表b,何時在表a中更新單行?

我該如何解決這個問題?

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 

ALTER TRIGGER [dbo].[PatientKilled] 
ON [dbo].[Patient] 
AFTER UPDATE 
AS 
BEGIN 
    DECLARE 

    SET NOCOUNT ON; 

    UPDATE Doctor 
    SET PatientsKilled += 1 
    FROM Doctor d 
    INNER JOIN inserted p ON d.DoctorId = p.DoctorId 
    WHERE p.PatientState = 'Killed' 
END 
+0

加入插入的表。在觸發器中,您可以訪問2個名爲插入和刪除的系統表。 –

回答

1

字「殺」意味着醫生是殺人,但無視這個問題本應該做你所需要的。

您應該檢查以前的狀態,並且只在計數器改變時才增加計數器。我認爲「Killed」是一個永久狀態,因此不需要添加邏輯來減少。你應該考慮你是否需要這個。

WITH p AS 
(
SELECT COUNT(*) AS NewKills, 
       I.DoctorId 
FROM INSERTED I JOIN DELETED D 
ON I.PatientId = D.PatientId 
WHERE I.PatientState = 'Killed' 
    AND (D.PatientState <> 'Killed' OR D.PatientState IS NULL) 
GROUP BY I.DoctorId 
) 
UPDATE d 
SET PatientsKilled += NewKills 
FROM Doctor d 
    INNER JOIN p ON d.DoctorId = p.DoctorId 
0
USE [AD17_Hospital] 
GO 
/****** Object: Trigger [dbo].[PatientKilled] Script Date: 2017-10-21 19:51:32 ******/ 
SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
ALTER TRIGGER [dbo].[PatientKilled] ON [dbo].[Patient] 
AFTER UPDATE 
AS 
BEGIN 

SET NOCOUNT ON; 
UPDATE Doctor 
SET PatientsKilled (SELECT COUNT(*) FROM Patients WHERE DoctorID = INSERTED.DoctorID AND PatientState = 'Killed') 
FROM Doctor d 

END 
+0

不,添加2 ...不知道發生了什麼......即使他在3名患者中加入2而不是4 ...之前殺死了3名患者... –

+0

有沒有一種方法可以將患者的數量設置爲符合狀態=殺死「每次一個患者狀態改變而被殺死?如果你明白我的意思 –

+0

已經更新了我認爲你想要的答案... –