обновить таблицу с помощью курсора? - PullRequest
0 голосов
/ 31 января 2011

Обновление

цель этого эксцесса состоит в том, чтобы исключить повторную передачу @RegModifiedDateTime, что я хочу, чтобы я мог читать ModifiedDateTime, передавая Id

пример: если я передам Id = 564, тогда я смогу прочитать

`schoold_Id and ModifiedDateTime`

конец обновления

вот как выглядит моя таблица для регистрации в школе:

school_id       id     active        modifydatetime
--------------------------------------------------
432        564       1               2008-12-14 13:15:38.750
342        564       1              2008-12-14 14:15:50.470
353        564       1              2008-12-14 14:19:46.703

конец обновления

как сделать цикл для обновления моей таблицы SchoolRegistration? идентификатор может иметь 1 или несколько строк в SchoolRegistration, но дело в том, что RegModifiedDateTime является уникальным для целей параллелизма, и я должен выполнить цикл, чтобы получить правильное время модификации для этого идентификатора.

alter procedure [dbo].[del_schoolRegistration]
    @Id bigint, 
    @RegModifiedDateTime datetime
as
begin  
    declare @rowsAffected int
    begin tran 


        --registration
        update SchoolRegistration
                   set Active = 0,
                    ModifiedDateTime = getdate()            
        where (Id = @Id and RegModifiedDateTime = @RegModifiedDateTime or @RegModifiedDateTime is null )


    if (@rowsAffected < 1) begin
        rollback tran
    end
    else begin
        commit tran
    end

    return @rowsAffected

end 

Ответы [ 2 ]

1 голос
/ 01 февраля 2011
   --registration
    ;with tmp as (
        select *, rn=ROW_NUMBER() over (partition by ID order by RegModifiedDateTime desc)
        from SchoolRegistration
        where (Id = @Id and RegModifiedDateTime = @RegModifiedDateTime or @RegModifiedDateTime is null ))
    update tmp
               set Active = 0,
                ModifiedDateTime = getdate()            
    WHERE rn=1

В данном случае происходит то, что если вы не знаете искомый RegModifiedDateTime (передавая @RegModifiedDateTime как NULL), запрос будет перехватывать их все для идентификатора из-за @RegModifiedDateTime is null, но обновлять ТОЛЬКОLATEST RegModifiedDateTime, основанный на определении таблицы row_numbering и CTE.

EDIT

Приведенный выше запрос сохраняет возможность передачи прямого @RegModifiedDateTime в случае записи, отличной от последней необходимости обновления.Чтобы всегда обновлять только последние версии, полностью удалите фильтр WHERE для @RegModifiedDateTime

   --registration
    ;with tmp as (
        select *, rn=ROW_NUMBER() over (partition by ID order by RegModifiedDateTime desc)
        from SchoolRegistration
        where Id = @Id)
    update tmp
               set Active = 0,
                ModifiedDateTime = getdate()            
    WHERE rn=1
0 голосов
/ 01 февраля 2011

я заканчиваю с помощью курсора:

USE AdventureWorks
GO
DECLARE @ProductID INT
DECLARE @getProductID CURSOR
SET @getProductID = CURSOR FOR
SELECT ProductID
FROM Production.Product
OPEN @getProductID
FETCH NEXT
FROM @getProductID INTO @ProductID
WHILE @@FETCH_STATUS = 0
BEGIN
PRINT @ProductID
FETCH NEXT
FROM @getProductID INTO @ProductID
END
CLOSE @getProductID
DEALLOCATE @getProductID
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...