我試圖更新我們的系統中的患者表,但由於我們與將狀態發送到外部系統的狀態發生連接,因此無法進行大規模更新我們的系統中有幾個觸發器(Microsoft SQL Server 2008 R2)。在觸發代碼的主要一塊是防止無法單獨更新行
IF (@numrows > 1)
BEGIN
IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION
SELECT @errmsg = OBJECT_NAME(@@PROCID) + ' : more than one row is updated in table Patient'
RAISERROR(@errmsg,16,21)
RETURN
END
我不能簡單地關閉這些激發了它會打破了很多東西,所以做什麼會是
update patient set security_level = '2'
where security_level = '1'
一個簡單的動作
我用下面的代碼,在使用以前版本
declare @tmp_table table(
PRG int identity(1,1) Primary Key,
patient_id int
)
declare @start_value int = 1,
@finish_value int,
@patient_id int
Insert Into @tmp_table(patient_id) Select patient_id From patient where security_level = '1'
Select @finish_value = max(PRG) From @tmp_table
While @start_value <= @finish_value
Begin
--now get a key for patient and store in variables
Select @patient_id = patient_id
From @tmp_table
Where PRG = @start_value
--.. and now update by key
Update patient
set security_level = '2'
Where patient_id = @patient_id
Set @start_value = @start_value + 1
End
工作,我得到運行時的代碼
以下錯誤消息50000,級別16,狀態21,過程tU_Patient_HL7,行64
tU_Patient_HL7:多個行於表病人更新消息3609,級別16,狀態1,行22
事務在觸發器中結束。該批次已被中止。
任何想法如何我可以調整此或重新編碼此更新安全級別設置爲1的所有患者的安全級別並將其切換到2?
更新 會不會有什麼辦法,我可以循環
Update top (1) patient
set security_level = '2'
where security_level = '1'
直到所有的行會受到影響?那也可以。
哇停止批量更改到表的觸發器。這味道真的很糟糕。無論如何....你能確認'patient.patient_id'是一個主鍵還是唯一約束呢?如果不是那種味道更糟。 –
Patient_id是主鍵。開發者告訴我他們以這種方式設置的原因在於它向人口狀態發送人口統計信息,但發送事務的Java小程序無法發送大量更改。 –
開發人員認爲這不是一個好主意。無論如何,我不明白這裏的全部故事 –