我正在尝试在我们的系统中更新我们的患者表,但由于我们与将该表发送修改的状态连接到外部系统,我因为多个触发器而无法进行大量更新我们的系统(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:表PatientMsg 3609,Level 16,State 1,Line 22
交易在触发器中结束。批次已中止。
任何想法我如何调整或重新编码以更新安全级别设置为1并将其切换为2的所有患者的安全级别?
更新 我有什么方法可以循环
Update top (1) patient
set security_level = '2'
where security_level = '1'
直到所有行都受到影响?那也行。
答案 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次)取决于你。