I think you can use a temporary table in which you will store the top 100 identifiers from your original table after you ordered them. Thus, you will avoid executing the select statement in the where update section for each identifier.
BEGIN TRANSACTION copyTran
insert into destination_table (name)
select top 100 name
from source_table
order by id
declare @Ids TABLE(id int)
@Ids = (select top 100 id from source_table order by id)
update source_table
set copy_flag = 1
where id in (SELECT * FROM @Ids)
COMMIT TRANSACTION copyTran
source
share