Zie hieronder een procedure in SQL (2005). Het is een transaction. De rollback werkt, tenzij deze er iets mis gaat in de cursor, bijvoorbeeld wanneer ik een verkeerde tabel selecteer.
Bij de cursor gebruikte ik tabel #WorkTableContactmomenten in plaats van #WorkTable. Dan kloppen de velden uiteraard niet. Echter als de procedure dan draai krijg ik de volgende foutmelding (behalve natuurlijk de foutmeldingen over de velden):
Msg 266, Level 16, State 2, Procedure SP_IMPORT, Line 463
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Waarom wordt de rollback niet uitgevoerd? Kennelijk is de waarde van @@trancount niet juist. Hoe kan ik dit wel opvangen? Ook als er bij het declaren van de cursor of in de cursor while loop iets mis gaat moet er ook een rollback worden uitgevoerd en een insert in de log-tabel.
Alvast bedankt.
Bij de cursor gebruikte ik tabel #WorkTableContactmomenten in plaats van #WorkTable. Dan kloppen de velden uiteraard niet. Echter als de procedure dan draai krijg ik de volgende foutmelding (behalve natuurlijk de foutmeldingen over de velden):
Msg 266, Level 16, State 2, Procedure SP_IMPORT, Line 463
Transaction count after EXECUTE indicates that a COMMIT or ROLLBACK TRANSACTION statement is missing. Previous count = 0, current count = 1.
Waarom wordt de rollback niet uitgevoerd? Kennelijk is de waarde van @@trancount niet juist. Hoe kan ik dit wel opvangen? Ook als er bij het declaren van de cursor of in de cursor while loop iets mis gaat moet er ook een rollback worden uitgevoerd en een insert in de log-tabel.
Alvast bedankt.
SQL: SP_IMPORT
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
| use DATABASE set ansi_nulls on go set quoted_identifier on go alter procedure [dbo].[SP_IMPORT] as begin set nocount on; begin transaction IMPORT; begin try if object_id('tempdb..#WorkTable') is not null drop table #WorkTable; select 0 as MailKeyStatus, 0 as PostaddressKeyStatus, 0 as PostaddressStatus, 0 as DuplicateMKStatus, 0 as DuplicatePKStatus, null as Priority, * into #WorkTable from WORK where isNull(FINISHED,'')=''; if object_id('tempdb..#WorkTableContactmomenten') is not null drop table #WorkTableContactmomenten; create table #WorkTableContactmomenten ( ParentID int, IMPORT_BRON nvarchar(200) ); --Begin c1 cursor declare @ParentID int, @IMPORT_BRON nvarchar(200); declare c1 cursor for select ID, IMPORT_BRON from #WorkTable order by ID desc; open c1; fetch next from c1 into @ParentID, @IMPORT_BRON; while @@fetch_status=0 begin if @OPDEHOOGTE=1 begin insert into #WorkTableContactmomenten (ParentID, IMPORT_BRON) values (@ParentID, @IMPORT_BRON+'|A1'); insert into #WorkTableContactmomenten (ParentID, IMPORT_BRON) values (@ParentID, @IMPORT_BRON+'|A2'); end; if @OPDEHOOGTE=2 begin insert into #WorkTableContactmomenten (ParentID, IMPORT_BRON) values (@ParentID, @IMPORT_BRON+'|B'); end; fetch next from c1 into @ParentID, @IMPORT_BRON; end; close c1; deallocate c1; --End c1 cursor end try begin catch insert into LOG (ERROR_DT, ERROR_NUMBER, ERROR_SEVERITY, ERROR_STATE, ERROR_PROCEDURE, ERROR_LINE, ERROR_MESSAGE) select getdate(), error_number(), error_severity(), error_state(), error_procedure(), error_line(), error_message(); if @@trancount>0 begin rollback transaction return 1 end; end catch; if @@trancount>0 begin commit transaction return 0 end; end |