2016-01-08 114 views
0

我正在嘗試在我們的SQL服務器上執行批量更新,這很容易在我們的情況下由以下代碼完成。一次更新SQL行一行

update patient set security_level = '2' 
where security_level = '1' 

的問題是我們的SQL服務器連接到如果超過一個排在同一時間更新發送交易國家和歡笑服務器鎖定了一個歡樂的服務器,所以我希望有一種方法一次更新一行。爲了防止我們的軟件供應商有幾個觸發器到位。一段代碼的觸發器是

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 

如果我要禁用3觸發器它會打破其他的事情。感謝您的任何建議或想法。

回答

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 
+0

Msg 102,Level 15,State 1,Line 4 '<'附近語法不正確。 Msg 102,Level 15,State 1,Line 9 '<'附近的語法不正確。 Msg 102,Level 15,State 1,Line 11 「<」附近的語法不正確。 消息137,級別15,狀態1,行13 必須聲明標量變量「@finish_value」。 消息137,級別15,狀態2,行15 必須聲明標量變量「@ start_value」。 Msg 102,Level 15,State 1,Line 18 「<」附近的語法不正確。 消息102,級別15,狀態1,行25 '<'附近的語法不正確。 消息137,級別15,狀態2,行28 必須聲明標量變量「@ start_value」。 –

+0

我收到上面的錯誤。我有點頭大,所以不想猜錯。感謝您的幫助。 –

+0

我的錯。我不知道病人列表中的關鍵列。我會指出<在這裏聲明所有列是你的表的關鍵>,與@相同<在這裏聲明所有對你的表是關鍵的列,但是這次是變量> 。您必須用正確的值替換所有<..>部分。如果你在這裏報告鍵列名稱和類型我完成查詢。 – GigiS