Great post, and I learned a few things -- like updating usage and statistics. Since reading this I've determined that my SQL Server 2000 DBs have many usage discrepancies, which I will remedy after migrating them to 2008.
Interesting point about backup/restore -- it's the method I've always used. I will soon be migrating about 200 DBs in one instance, and if I have time, I'll try to benchmark both methods.
Detach/attach only copies each file once, whereas backup/restore has to copy them twice. Furthermore if you use robocopy instead of xcopy, it has an option to use multi-threading which may speed up the copy even further.
However I already have a backup/restore procedure working and so that's my default method if I'm not allocated time to experiment.
Meanwhile, I was trying out some of the scripts, and ran into a problem on #6. Trying to save the generated script into a procedure (which seems the logical place to save it), I got:
Msg 154, Level 15, State 1, Procedure Migrate6_Usage, Line 9
a USE database statement is not allowed in a procedure, function or trigger.
So instead of generating code like this
the script should generate
I suppose this issue may pop up in some of the other scripts also.