无法单独更新行

时间:2016-04-28 13:22:42

标签: triggers sql-server-2008-r2 sql-update

我正在尝试在我们的系统中更新我们的患者表,但由于我们与将该表发送修改的状态连接到外部系统,我因为多个触发器而无法进行大量更新我们的系统(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

运行该代码后出现以下错误

  

Msg 50000,Level 16,State 21,Procedure tU_Patient_HL7,Line 64
  tU_Patient_HL7:表Patient

中更新了多行      

Msg 3609,Level 16,State 1,Line 22
  交易在触发器中结束。批次已中止。

任何想法我如何调整或重新编码以更新安全级别设置为1并将其切换为2的所有患者的安全级别?

更新 我有什么方法可以循环

 Update top (1) patient
 set security_level = '2' 
 where security_level = '1'

直到所有行都受到影响?那也行。

2 个答案:

答案 0 :(得分:1)

没有完整的代码,很难。我猜你的更新语句与下面的代码冲突..

IF(@numrows&gt; 1)

即使您使用

  Update patient
  set security_level = '2'
  Where patient_id  = @patient_id 

您的更新查询可能会影响多行。所以我最好的选择是将您的更新查询调整到下方或更改触发器(如果可以的话)

 Update top (1) patient
  set security_level = '2'
  Where patient_id  = @patient_id 

答案 1 :(得分:1)

如果您在更新代码中添加“GO 100”,那应该可以解决问题。如果触发器更新速度太快,您可能需要在此处加一个延迟。

$data =  array ( array ('sale_order_value_id' => 3,
                             'sale_order_id' => 2,
                             'name' => 'Comprobante Fiscal',
                             'value' => 'Consumidor Final',                 
                             'price' => 0.0000 ),
                array ( 'sale_order_value_id' => 4,
                             'sale_order_id' => 2,
                             'name' => 'RNC / Cédula',
                             'value' => 00111936266,
                             'price' => 0.0000 )
              ) ;

执行次数(即我的例子中的100次)取决于你。