В этом столько всего плохого, что я не знаю, с чего начать.
Что касается вашего вызова с ошибкой, вы отслеживаете, есть ли ошибка на последнем шаге, выполненном перед ошибкой, а не если какая-либо ошибка произошла до сих пор. Поскольку последний шаг - это не вставка, а оператор set_identity_insert, нет ошибки для перехвата.
Теперь о том, что нужно исправить, кроме этого.
Если это таблица резервных копий и используется только как таблица резервных копий, все вместе избавьтесь от свойства удостоверения. Нет необходимости постоянно включать и выключать вставку, просто исправьте таблицу, она не записывается пользователями напрямую, а данные поступают из другой таблицы, так зачем вообще нужна идентификация?
Далее, ошибка, которую вы получили, указывает мне, что вам нужно вставить только те записи, которые еще не существуют, в таблицу резервных копий, а не все записи. Вам также может понадобиться обновить существующие записи. Или вам нужно сначала обрезать таблицу перед выполнением вставки, если вам нужен только самый последний период данных, а копируемая таблица данных не такая большая (вы не хотите повторно вводить миллион записей, когда только 100 были новыми и 10 были изменены).
В SQL Server 2005 у вас есть доступные блоки TRY CATCH, вы должны начать использовать их вместо goto.
Никогда, никогда, никогда не используйте SELECT * во вставке. Или в любое время код будет запущен в производство. Select * - очень плохая методика программирования. Например, при вставке это вызовет проблемы при изменении исходной таблицы, поскольку вы определяете столбцы для вставки, но не столбцы для выбора.
Наконец, вы не должны называть хранимые процедуры с sp в начале. Системные процессы запускаются с sp, и SQL Server сначала будет искать процедуру, прежде чем просматривать пользовательские процедуры. Это немного потерянное время каждый раз, когда вы вызываете прок. В целом, это плохо для системы, и если у них будет системный процесс с таким же именем, ваш никогда не будет вызван.