Cześć, trafiłem na bardzo dziwny problem.
Otóż, mam tabelę:
TAB1
-------------
ID bigint primary key identity
uid bigint not null
did bigint not null
s varchar(max)
Z poziomu aplikacji tworzę sobie tabelę tymczasową #tTab1 - ma te same pola, co tab1 poza ID.
Następnie do tej tabeli tymczasowej robię kilka insertów.
I wywołuję procedurę składowaną, która generalnie przepisuje rekordy z tabeli #tTab1 do tab1. Sprawdzając, czy już istnieją i jeśli istnieje, to wykonuje UPDATE, w innym razie INSERT. Rekord istnieje, jeśli równe są sobie pola UID i DID.
I teraz co się dzieje:
- Mam uruchomiony program w trybie debugowania. Na serwerze mogę wykonać zapytanie SELECT * FROM TAB1 tylko do momentu wywołania z aplikacji procedury składowanej. Potem gdy to próbuję zrobić, sql się mieli, mieli i nie kończy mielić. Ale gdy zamknę aplikację, normalnie już mogę select puścić, jednak wygląda, że tabela TAB1 jest pusta.
- Gdy z poziomu serwera utworzyłem tabelę tymczasową i powrzucałem do niej jakieś dane, a potem wywołałem procedurę, wszystko poszło ok. I zobaczyłem coś dziwnego. Kolumna ID była numerowana od 20. Wcześniej robiłem kilka prób z aplikacji, czyli wygląda na to, jakby zwiększany był licznik.
O co tu może chodzić?
Kod procedury składowanej:
CREATE PROCEDURE [dbo].[SetDeptRights]
AS
BEGIN
SET NOCOUNT ON
declare @uid bigint
declare @deptID bigint
declare @rights varchar(max)
declare @recID bigint
declare tdrCur
cursor for
select uid, deptID, rights from #tDeptRights
open tdrCur
fetch next from tdrCur into @uid, @deptID, @rights
while @@FETCH_STATUS = 0
begin
-- sprawdzam, czy taki rekord istnieje
SELECT @recID = ID
from deptRights
where uid = @uid and deptID = @deptID
if @recID is null
insert into deptRights(uid, deptID, rights) values(@uid, @deptID, @rights)
else
update deptRights SET
rights = @rights
where ID = @recID
fetch next from tdrCur into @uid, @deptID, @rights
end
close tdrCur
deallocate tdrCur
END
[DODANE]
Po głębszej analizie dochodzę do wniosku, że to jest coś nie tak z aplikacją. Ale też coś dziwnego, bo rzeczy, które działały do tej pory nie działają teraz :| Zapytanie niby się wykonuje, nie ma żadnego błędu, a tak naprawdę efektem jest jakby blokada tabeli :|