Selecting, inserting, updating and deleting in a single query - possibly?
Sure, you can use the OUTPUT clause in an UPDATE statement.

-- create some test tables

create table #sample(
    id int identity(1,1) not null primary key, 
    serial varchar(50), 
    reason varchar(50), 
    movedTo varchar(50), 
    region varchar(50), 
    movedDate date
    );

go

create table #sample2(
    id int identity(1,1) not null primary key, 
    serial varchar(50), 
    reason varchar(50), 
    destination varchar(50), 
    );

go

-- add some sample data
insert #sample(serial, reason, movedTo, region, movedDate)
select top(10) RTRIM(row_number() over( order by @@SPID)), newid(), newid(), null, GETDATE()
from sys.columns a;

go

-- perform the update/insert in one
update #sample 
set region = movedTo, movedTo = null, movedDate = null
output deleted.serial, deleted.reason, deleted.movedTo 
into #sample2(serial, reason, destination)
where movedTo is not null;

go

-- show the result
select *
from #sample;

select *
from #sample2;