Írok egy MS SQL Tárolt eljárást. Az alábbi sorok vannak benne:
declare @cr CURSOR Declare @Myid nvarchar(40) Declare @Myidx nvarchar(40) declare @lastid varchar(50) declare @idd int UPDATE M SET Name = M_Modify.[Name], NameLocal = M_Modify.NameLocal FROM M , M_Modify WHERE M.MYID = M_Modify.MYID SET @cr = CURSOR FAST_FORWARD FOR SeleCT myid FROM M_Modify ORDER BY myid OPEN @cr /* Mergnyitom a cursort a táblára */ while @@FETCH_STATUS = 0 /* Ciklussal végigmegyek az M_Modify tábla sorain */ begin fetch next from @cr into @MyID /* Beolvasom a következő sort */ SET @MyIDx = '---' /* Megnézem, hogy a módosítandó táblában van-e ilyen MYID-j? sor */ SeleCT @MyIDx = M.MyID FROM M WHERE M.MyID = @MyID if @MyIDx = '---' begin /* Ha nincs ilyen MYId-j? sor, akkor beszúrok egyet ezzel az MYID-vel*/ INSERT INTO M ( MYID ) VALUES ( @MyID ) commit /* <======== Ennek a hiánya miatt vagy 4 órán keresztül */ /* Update-et futtatok az előzőleg beszúrt sorra. */ UPDATE M SET Name = Muszer_Modify.[Name], NameLocal = Muszer_Modify.NameLocal FROM M , M_Modify WHERE ( M.MyID LIKE @MyID ) AND ( M_Modify.MYID LIKE @MyID ) end end /* While */
A fenti kód egy változásokat tartalmazó táblából átemel adatokat az eredeti táblába.
Ha a MyID megvan az eredeti táblában, akkor csak módosítja az adatokat táblában. Ha nincsen meg a MYID az eredeti táblában, akkor hozzáfűzi a rekordokat a hiányzó MYID-vel.
A fenti kódban a commit hiánya miatt kb. négy órán keresztül nem láttam a beszúrott sorokat akkor, amikor lekérdeztem a táblát egy SELECT * FROM M utasítással. A hajamat téptem. Betettem a COMMIT parancsot és minden rögtön ment.
Tanulság: A programozás is egy szopás!