Мне было бы интересно узнать, зачем вам сначала копировать данные в другую таблицу. Но это не по теме ...
Временная таблица (#temp) условно хранится на диске, а переменные таблицы (@temp) условно хранятся только в памяти и могут быть более оптимальными для небольших задач. (Предполагается, что записи в таблицу будут влиять только на небольшое количество строк.)
Временные таблицы, однако, могут быть созданы с помощью трюка SELECT INTO, избегая необходимости заранее знать определение таблицы.
Если вы заранее знаете определение таблицы, не можете ли вы просто использовать что-то вроде следующего?
DECLARE @temp TABLE (id AS INT, val as INT)
IF @ChangeType = 'D'
INSERT INTO @temp SELECT * FROM DELETED
ELSE
INSERT INTO @temp SELECT * FROM INSERTED
Лично я бы даже не стал использовать *, если это возможно. Ваши последующие запросы будут использовать только определенные поля, поэтому я буду копировать только те поля, которые я использовал. Это дает дополнительное преимущество: если поля добавляются в таблицу, код не нарушается ...
DECLARE @temp TABLE (id AS INT, val as INT)
IF @ChangeType = 'D'
INSERT INTO @temp SELECT id, val FROM DELETED
ELSE
INSERT INTO @temp SELECT id, val FROM INSERTED
На мой взгляд, преимущество указания полей (а это то, чего вы хотите избежать) заключается в том, что вы всегда можете копировать только то, что вам нужно.