Я создаю скрипт, который будет запускаться на сервере MS SQL. Этот сценарий будет выполнять несколько операторов и должен быть транзакционным, если один из операторов завершится неудачно, общее выполнение будет остановлено, а любые изменения будут отменены.
У меня проблемы с созданием этой транзакционной модели при выполнении операторов ALTER TABLE для добавления столбцов в таблицу и последующего обновления вновь добавленного столбца. Чтобы сразу получить доступ к вновь добавленному столбцу, я использую команду GO для выполнения оператора ALTER TABLE, а затем вызываю мой оператор UPDATE. Проблема, с которой я сталкиваюсь, заключается в том, что я не могу выполнить команду GO внутри оператора IF. Оператор IF важен в моей транзакционной модели. Это пример кода скрипта, который я пытаюсь запустить. Также обратите внимание, что при выполнении команды GO будет отменена переменная @errorCode, и ее необходимо будет объявить в коде перед использованием (этого нет в приведенном ниже коде).
BEGIN TRANSACTION
DECLARE @errorCode INT
SET @errorCode = @@ERROR
-- **********************************
-- * Settings
-- **********************************
IF @errorCode = 0
BEGIN
BEGIN TRY
ALTER TABLE Color ADD [CodeID] [uniqueidentifier] NOT NULL DEFAULT ('{00000000-0000-0000-0000-000000000000}')
GO
END TRY
BEGIN CATCH
SET @errorCode = @@ERROR
END CATCH
END
IF @errorCode = 0
BEGIN
BEGIN TRY
UPDATE Color
SET CodeID= 'B6D266DC-B305-4153-A7AB-9109962255FC'
WHERE [Name] = 'Red'
END TRY
BEGIN CATCH
SET @errorCode = @@ERROR
END CATCH
END
-- **********************************
-- * Check @errorCode to issue a COMMIT or a ROLLBACK
-- **********************************
IF @errorCode = 0
BEGIN
COMMIT
PRINT 'Success'
END
ELSE
BEGIN
ROLLBACK
PRINT 'Failure'
END
Итак, я хотел бы знать, как обойти эту проблему, выполнив инструкции ALTER TABLE, чтобы добавить столбец, а затем обновив этот столбец, все в скрипте, выполняемом как транзакционная единица.