2017-10-21 166 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

已经更新了我认为你想要的答案... –