如何解决在带有try..catch的游标中使用事务
我有一个利用游标的大型存储过程。我想将游标处理的每个实例放入一个事务中,在一个插入上插入try-catch,如果失败,该尝试将终止该事务,返回它所做的所有插入,然后移至下一个游标实例。但是,我正在努力构建此结构。
下面是一个简短的示例。基本上,我正在尝试为患者插入构建try-catch,以使事务回滚并在患者插入失败时转到下一个游标值。
谢谢
ALTER procedure [dbo].[Import_Archive_Record]
@PatientNumber varchar(10),@PracticeId int
as
begin
DECLARE csr1 CURSOR for
select PatientNumber from ArchiveFull.dbo.ArchiveMasters where imported = 0 and PracticeId =
@PracticeId and PatientNumber = @PatientNumber
open csr1
fetch next from csr1 into @PatNo
while @@FETCH_STATUS = 0
begin
insert into Member....
select @memberId = SCOPE_IDENTITY()
print 'new member ' + cast(@memberId as varchar(10))
--insert patient
BEGIN TRY
select @initials = PatientInitials,@surname = PatientSurname,@name = PatientFirstname,@DateOfBirth = DOBStr,@PatientCentury = DOBCen
from ArchiveFull.dbo.ArchiveMasters
where ArchiveFull.dbo.ArchiveMasters.PatientNumber = @PatNo
and imported = 0
and PracticeId = @PracticeId
set @patientID = null
select @patientID = id from Patient
where Initials = @initials
and Surname = @surname
and Name = @name
and MemberId = @memberId
print 'patientid ' + cast(@patientID as varchar(10))
set @DOB = dbo.getVisitdate(@PatientCentury,@DateOfBirth)
if @patientID is null
begin
insert into Patient(Name,Surname,Initials,MemberId,PostalSuburb,PostalCity,PostalCode,PostBox,Gender,DateofBirth,IDNumber,DependentCode,RelationToMember,AlternativesRelation,EMailAddress,CellPhone,Title)
select PatientFirstname,PatientSurname,coalesce(PatientInitials,'.'),@memberId,PatientAddress1,PatientAddress2,PatientAddress3,PatientAddress4,@DOB,PatientIDNumber,1,PatientEmail,CellNumber,PatientTitle
from ArchiveFull.dbo.ArchiveMasters
where PatientNumber = @PatNo
and imported = 0
END TRY
BEGIN CATCH
END CATCH
select @patientID = SCOPE_IDENTITY()
print 'new patientid ' + cast(@patientID as varchar(10))
end
set @BranchId = (select top 1 id from Branch where practiceid = @practiceId and ModalityRooms like concat('%',@BranchCode,'%'))
set @visitId = null
select @visitId = id from Visit
where BookingNumber = @PatNo
and BranchId = @BranchId
if @visitId is null
begin
declare @visitDate datetime
declare @century int
declare @date int
declare @DoctorCode nvarchar (max)
declare @DoctorSurname nvarchar (max)
declare @wca bit
select @century = Century,@date = ExamDateStr,@DoctorCode = RefDocCode,@DoctorSurname = RefDoc,@wca=WCA
from ArchiveFull.dbo.ArchiveMasters
where ArchiveFull.dbo.ArchiveMasters.PatientNumber = @PatNo
and imported = 0
and PracticeId = @PracticeId
update testlist
set century = @century,examdate = @date
where patno = @PatNo
set @visitDate = isnull(dbo.getVisitdate(@century,@date),'19000101')
set @DoctorId = null
set @DoctorId = dbo.getDoctorIdRadmin(@DoctorCode,@practiceId)
insert into Visit(Date,EndMonth,EndYear,NewBorn,HospitalClaim,WCA,WorkersComp,RAF,RoadAccidentFund,Examined,Booking,BookingNumber,PatientId,Notes,PreAuthorise,PreAuthNumber,BranchId,DoctorId,Receipted,ArchiveId)
select @visitDate,MONTH(@visitDate),YEAR(@visitdate),'',@PatNo,@patientID,AUTHNO,@BranchId,@DoctorId,@archiveid
from ArchiveFull.dbo.ArchiveMasters
where ArchiveFull.dbo.ArchiveMasters.PatientNumber = @PatNo
and imported = 0
and PracticeId = @PracticeId
fetch next from csr1 into @PatNo
end
close csr1
deallocate csr1
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。