I've had to do this in the past for a large set of data. I found the best way to be using a stored procedure, temp tables, and GUID column for each table. In my case we had one stored procedure that did all the copying for all tables involved, but you could do one for each table if you wish. We made a set of temp tables that were an exact copy of all the tables we would be copying from, but in a different schema and with no keys. When copying, we inserted a copy of all the records into the temp tables. Then, we inserted from the temp tables back into the dbo tables. The idea is to first insert records that have no FKs (these are top-level items). Then, in the temp area any records that have a reference to the top-level record that was just inserted have their FK field updated in the temp table and are then inserted into dbo. The reason for the GUID column, you will find, is that was the only way to tie the copied record back to the original for the purpose of updating the foriegn keys. If you have 4 records all tied together by foriegn key relationships, then you would want all of your copied records to be tied together in the same way. The only way to do that is to keep track, in some way, of the IDs of the originals and the IDs of the copies and update them accordingly. If you will be doing batch inserts (as we were) then a GUID column was the only solution we found, but if all inserts are single records, then you may not need a GUID column in the tables. Here's a quick idea of how it goes using a GUID column:
-- copy data from dbo to temp schema
INSERT temp.One (field1, field2, guid, etc)
SELECT field1, field2, guid, etc
FROM dbo.One
WHERE OneID = @OneID
INSERT temp.Two (field1, field2, guid, etc)
SELECT field1, field2, guid, etc
FROM dbo.Two t
INNER JOIN temp.One o ON o.OneID = t.OneID
...
-- update GUIDs in temp area
UPDATE temp.One
SET guid = NEWID()
UPDATE temp.Two
SET guid = NEWID()
...
-- insert from temp to dbo
INSERT dbo.One (field1, field2, guid, etc)
SELECT field1, field2, guid, etc
FROM temp.One
-- need to update FK here before inserting to dbo, join from temp to dbo on GUID
UPDATE temp.Two
SET OneID = c.OneID
FROM temp.Two t
INNER JOIN temp.One o ON t.OneID = o.OneID
INNER JOIN dbo.One c ON c.GUID = o.GUID
INSERT dbo.Two (field1, field2, guid, etc)
SELECT field1, field2, guid, etc
FROM temp.Two
...