I have a handful or so of permanent tables that need to be re-built on a nightly basis.
In order to keep these tables \"live\" for as long as possible, and also to
if you use SQL Server 2008, why can't you try to use horisontal partitioning? All data contains in one table, but new and old data contains in separate partitions.
Use indirection to avoid manuipulating tables directly:
You can use SELECT base_object_name FROM sys.synonyms WHERE name = 'Client'
to work out what the current indirection is
This works on all editions of SQL Server: the other way is "partition switching" which requires enterprise edition
Except of missing step 0. Drop tbl_Client_old if exists
solutions seems fine especially if you run it in explicit transaction. There is no backup of any previous data however.
The other solution, without renames and drops, and which I personally would prefer is to:
It's better in a way that you can control how much of the old data you can store in tbl_Client_old. Which solution will be faster depends on how much data is stored in tables and what indices in tables are.
Some things to keep in mind:
Those are the possible drawbacks I can think of off the top of my head. It otherwise seems to be an effective way to handle the situation.