t-sql并发程序问题

时间:2010-08-25 05:59:35

标签: tsql recurrence

我有这段代码:

CREATE PROCEDURE AddTask
@SessionID uniqueidentifier,
@Login nvarchar(max),
@Uni nvarchar(max),
@Time datetime,
@MaxOverviewTime int,
@Date datetime,
@DoTaskTime int,
@Priority int,
@TaskID int,
@TaskWillBeDoIn datetime output
AS
BEGIN
SET NOCOUNT ON;
/*Algorytm
1. Pobranie wszystkich zadań do tymczasowej tabelki @Tasks, 
    które mogły by się wykonywać w czasie zadania dodawanego
    1.1 Jeżeli nie ma żadnych takich zadań dodać zadanie do tabelki UsersUniTask
2. Sprawdzić czy istnieje jakieś zadanie o niższym lub rónym priorytecie od zadania dodawanego
    - jezeli tak:
        2.1. Wykonać tą procedurę po skończeniu zadania z wyższym priorytetem 
            (PAMIĘTAĆ O 1 SEKUNDZIE WIĘCEJ NIŻ SUMA CZASU I CZASU WYKONYWANIA)
            (SPRAWDZAĆ OD KOŃCA - ZADANIA NAJPÓŹNIEJ SIĘ KOŃCZĄCEGO)
    - jeżeli nie: 
        2.2. Usunąć wszystkie zadania będące w tymczasowej tabelce @Tasks z tabeli UsersUniTask
        2.3. Dodać zadanie do tabelki UsersUniTask
        2.4. Dla wszystkich krotek z tymczasowej tableki @Tasks zastosować tą procedurę
            (MOŻNA BY USTAWIĆ CZAS ZADAŃ NA KONIEC ZADAIA DODANEGO - PAMIĘTAĆ O 1 SEKUNDZIE WIĘCEJ)
3. Pobranie najnowszych zadań
*/

    Declare @NewTaskTime datetime;
    Declare @Count int;
    Declare @Tasks TABLE
    (
        id uniqueidentifier,
        userUniID uniqueidentifier,
        taskID INT,
        [time] datetime,
        doTask int,
        priority int
    )

/*PTK. 1*/
    Insert Into @Tasks (id, UserUniID, taskID, [time], doTask, priority)
      select uut.id, uut.userUniID, uut.taskID, uut.[time], uut.doTask, uut.priority
        from UsersUniTask uut
            inner join UsersUni uu
                on uut.userUniID = uu.id
        where uu.sessionID = @SessionID
            AND uu.Login = @Login
            AND uu.uni = @Uni
            AND (@Date BETWEEN uut.[time] AND DATEADD(SECOND, uut.doTask, uut.[time])
                OR uut.[time] BETWEEN @Date AND DATEADD(SECOND, @DoTaskTime, @Date))
/*KONIEC PTK. 1*/

Select @Count = count(*) from @Tasks
print 'ilość zadań: ' + Convert(nvarchar(max), @Count)

if(@Count = 0)
    begin
        /*PTK. 1.1*/
        print '1.1'
        Insert Into UsersUniTask (id, UserUniID, taskID, [time], doTask, priority)
        (select newid(), uu.id, @TaskID, @Date, @DoTaskTime, @Priority
            from UsersUni uu
            where uu.sessionID = @SessionID
                AND uu.Login = @Login
                AND uu.uni = @Uni)
        set @TaskWillBeDoIn = @Date;
        /*KONIEC PTK. 1.1*/
    end
else
    begin
        print '2'
        select @Count = count(*) 
            from @Tasks
            where priority <= @Priority 
        if(@Count = 0)
            begin
                print '2.2'
                --Dodanie zadania w jego czasie ptk 2.2-2.4
                --PTK. 2.2
                delete from UsersUniTask where id in (select id from @Tasks)
                --KONIEC PTK. 2.2
                --PTK. 2.3
                Insert Into UsersUniTask (id, UserUniID, taskID, [time], doTask, priority)
                (select newid(), uu.id, @TaskID, @Date, @DoTaskTime, @Priority
                    from UsersUni uu
                    where uu.sessionID = @SessionID
                        AND uu.Login = @Login
                        AND uu.uni = @Uni)
                set @TaskWillBeDoIn = @Date;
                --KONIEC PTK. 2.3
                --PTK. 2.4
                DECLARE @id uniqueidentifier;
                DECLARE @uuID uniqueidentifier;
                DECLARE @tID int;
                DECLARE @dtTime int;
                DECLARE @p int;

                set @NewTaskTime = DATEADD(SECOND, @DoTaskTime + 1, @Date) 

                DECLARE AddTaskCursor CURSOR FAST_FORWARD READ_ONLY FOR (SELECT id, userUniID, taskID, doTask, priority FROM @Tasks)
                Open AddTaskCursor

                FETCH NEXT FROM AddTaskCursor INTO @id, @uuID, @tID, @dtTime, @p;
                WHILE @@fetch_status = 0
                BEGIN
                    --TODO ZROBIĆ WYWOŁANIE PROCEDURY

                    FETCH NEXT FROM AddTaskCursor INTO @id, @uuID, @tID, @dtTime, @p;
                END
                CLOSE AddTaskCursor;
                DEALLOCATE AddTaskCursor;

                --KONIEC PTK. 2.4
            end
        else
            begin 
                --PTK. 2.1
                print '2.1'
                select @NewTaskTime = DATEADD(SECOND, doTask + 1, [time]) 
                    from @Tasks
                    where priority <= @Priority
                        AND [time] = (select max([time]) from @Tasks where priority <= @Priority)

                EXEC AddTask
                    @SessionID, 
                    @Login, 
                    @Uni,
                    @Time, 
                    @MaxOverviewTime, 
                    @NewTaskTime,
                    @DoTaskTime, 
                    @Priority, 
                    @TaskID,
                    @TaskWillBeDoIn
                --KONIEC PTK. 2.1
            end
    end


/*PTK. 3*/    
  Exec GetTasks 
    @SessionID, 
    @Login, 
    @Uni, 
    @Time, 
    @MaxOverviewTime
/*KONIEC PTK. 3*/
SET NOCOUNT OFF;
END

我对章节有疑问:

else
                begin 
                    --PTK. 2.1
                    print '2.1'
                    select @NewTaskTime = DATEADD(SECOND, doTask + 1, [time]) 
                        from @Tasks
                        where priority <= @Priority
                            AND [time] = (select max([time]) from @Tasks where priority <= @Priority)

                    EXEC AddTask
                        @SessionID, 
                        @Login, 
                        @Uni,
                        @Time, 
                        @MaxOverviewTime, 
                        @NewTaskTime,
                        @DoTaskTime, 
                        @Priority, 
                        @TaskID,
                        @TaskWillBeDoIn
                    --KONIEC PTK. 2.1
                end

即使程序没有打印'2.1'(打印'2.1'),此部分也始终执行。

过程添加两个记录,应该是一个。

当我发表评论时:

EXEC AddTask
                            @SessionID, 
                            @Login, 
                            @Uni,
                            @Time, 
                            @MaxOverviewTime, 
                            @NewTaskTime,
                            @DoTaskTime, 
                            @Priority, 
                            @TaskID,
                            @TaskWillBeDoIn

它运作正常。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

在遇到问题后,是否有可能在问题部分添加了开头/结尾?

如果缺少开始/结束,则else块仅包含print命令,并且无论如何都将执行SELECT和EXEC。

否则,我无法想象EXEC会如何发生而不是PRINT。