Ok, in our shop we do the following when working with large tables and transactions.
--This section strictly creates the table, and nothing else.
SELECT ColumnOne, ColumnTwo, ColumnThree... INTO TableName_Destination
FROM TableName_Source
WHERE 1 = 0
--This section copies the required data into the newly created table, with no metadata locks.
INSERT INTO TableName_Destination
SELECT ColumnOne, ColumnTwo, ColumnThree...
FROM TableName_Source
The reason for the (WHERE 1 = 0) is to reduce locking on the metadata tables. The typical locking required when using (WHERE 1= 0) on the metadata tables is less than a second. This should alleviate your problems.
😀