Even if we fix your logic problems (above) you will still have concurrency issues. Try this code out: (you can run this code block as is to check it out)use northwindset nocount oncreate table #files (fileid int, filename varchar(10), sortOrder int)goinsert #filesselect 1, 'Box', 1 union allselect 2, 'Cat', 2 union allselect 3, 'Kite', 3 union allselect 4, 'dog', 4 union allselect 5, 'mouse', 5gocreate proc oc_OnlineCaseFileSortOrder @fileid int ,@direction intasdeclare @sortOrder int--validate @fileid--validate @directionbegin tran --get sortOrder of @fileid select @sortOrder = sortOrder from #files where fileid = @fileid if @direction < 0 begin if not exists (select 'tg' from #files where sortOrder <= @sortOrder + @direction) goto onError end else begin if not exists (select 'tg' from #files where sortOrder >= @sortOrder + @direction) goto onError end --update all affected fileid sortOrders update #files set sortOrder = sortorder + sign(@direction) * -1 from #files where sortOrder >= case when @direction < 0 then @sortOrder + @direction else @sortOrder end and sortOrder <= case when @direction < 0 then @sortOrder else @sortOrder + @direction end --set new sortOrder of @fileid update #files set sortOrder = @sortOrder + @direction from #files where fileid = @fileid commit tranreturn 0onError:if @@trancount > 0 rollback tranraiserror ('invalid @direction', 18,1)return -1goprint 'original order'select * from #files order by sortOrderprint 'move dog up 2'exec oc_OnlineCaseFileSortOrder 4, -2select * from #files order by sortOrderprint 'move dog back to original position'exec oc_OnlineCaseFileSortOrder 4, 2select * from #files order by sortorder godrop proc oc_OnlineCaseFileSortOrderdrop table #filesBe One with the OptimizerTG