Я бы предложил использовать переменную таблицы, поскольку транзакция на нее не влияет (это один из методов, перечисленных в блоге, отмеченном Мартином ниже вопроса).Подумайте об этом, что будет работать в SQL Server 2005:
DECLARE @TempLog TABLE (FieldList...)
BEGIN TRY
BEGIN TRAN
INSERT...
INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...)
INSERT...
INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...)
COMMIT TRAN
END TRY
BEGIN CATCH
IF (@@TRANCOUNT > 0)
BEGIN
ROLLBACK TRAN
END
/* Maybe add a Log message to note that we ran into an error */
INSERT INTO @TempLog (FieldList...) VALUES (@Variables or StaticValues...)
END CATCH
INSERT INTO RealLogTable (FieldList...)
SELECT FieldsList
FROM @TempLog
Обратите внимание, что, хотя мы используем тот факт, что переменные таблицы не являются частью транзакции, это создает потенциальную ситуацию, когда этокод выполняет COMMIT, но выдает ошибки (или происходит сбой сервера) перед INSERT INTO RealLogTable, и вы потеряете запись для данных, которые его внесли. В этот момент будет отключение, поскольку есть данные, но нет записи об ихвставлено, насколько это касается RealLogTable.Но это только очевидный компромисс для возможности обойти транзакцию.