Я создаю script, который будет запущен на сервере MS SQL. Этот script будет запускать несколько операторов и должен быть транзакционным, если один из операторов завершится неудачей, общее выполнение остановлено и все изменения будут отброшены назад.
У меня возникла проблема с созданием этой транзакционной модели при выпуске операторов ALTER TABLE для добавления столбцов в таблицу, а затем обновления вновь добавленного столбца. Чтобы сразу же получить доступ к вновь добавленному столбцу, я использую команду GO для выполнения инструкции ALTER TABLE, а затем вызывать оператор UPDATE. Проблема, с которой я столкнулся, заключается в том, что я не могу выпустить команду GO внутри оператора IF. Утверждение IF важно в моей транзакционной модели. Это пример кода script, который я пытаюсь запустить. Также обратите внимание, что выдача команды 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, чтобы добавить столбец, а затем обновить этот столбец, все в script, выполняемом как транзакционное устройство.