我正在创建一个将在MS SQL服务器上运行的脚本。该脚本将运行多个语句,并需要具有事务性,如果其中一个语句失败,则会停止整个执行并回滚任何更改。
当向表添加列并更新新添加的列时,我遇到了创建此事务模型的问题。为了立即访问新添加的列,我使用GO命令来执行ALTER TABLE语句,然后调用我的UPDATE语句。我面临的问题是,在IF语句内部无法使用GO命令。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语句以添加列,然后更新该列。