我有一个在 Microsoft Azure 中运行的数据库。 我想在其中运行一个脚本。问题是脚本只有在一次运行一个 SQL 命令时才有效。所以几个命令同时执行。例如,SQL 想要在创建列之前更新列。
例如我想确保在执行 UPDATE 之前先执行 SQL 命令 ADD。
我怎样才能让脚本中的所有命令一个接一个地执行而不是并行执行?
我得到一个错误
Failed to execute query. Error: Invalid column name 'table_1_id'
这是我的代码:
BEGIN TRY
BEGIN TRANSACTION
ALTER TABLE table_1
ADD table_1_id BIGINT;
UPDATE table_1 SET table_1_id = table_1_id2;
ALTER TABLE table2
DROP CONSTRAINT constraint1;
ALTER TABLE table_1
DROP CONSTRAINT PK_1;
ALTER TABLE table_1
DROP COLUMN table_1_id2;
ALTER TABLE table_1
ADD table_1_id2 BIGINT IDENTITY PRIMARY KEY;
COMMIT TRAN -- Transaction Success!
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN --RollBack in case of Error
-- <EDIT>: From SQL2008 on, you must raise error messages as follows:
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
-- </EDIT>
END CATCH
改为回答:
BEGIN TRY
BEGIN TRANSACTION
ALTER TABLE table_1
ADD table_1_id BIGINT;
EXEC(N'UPDATE table_1 SET table_1_id = table_1_id2;')
ALTER TABLE table2
DROP CONSTRAINT constraint1;
ALTER TABLE table_1
DROP CONSTRAINT PK_1;
ALTER TABLE table_1
DROP COLUMN table_1_id2;
ALTER TABLE table_1
ADD table_1_id2 BIGINT IDENTITY PRIMARY KEY;
COMMIT TRAN -- Transaction Success!
END TRY
BEGIN CATCH
IF @@TRANCOUNT > 0
ROLLBACK TRAN --RollBack in case of Error
-- <EDIT>: From SQL2008 on, you must raise error messages as follows:
DECLARE @ErrorMessage NVARCHAR(4000);
DECLARE @ErrorSeverity INT;
DECLARE @ErrorState INT;
SELECT
@ErrorMessage = ERROR_MESSAGE(),
@ErrorSeverity = ERROR_SEVERITY(),
@ErrorState = ERROR_STATE();
RAISERROR (@ErrorMessage, @ErrorSeverity, @ErrorState);
-- </EDIT>
END CATCH
这允许新列对更新可见。 如果它们崩溃了,您可以对其他部分使用相同的技术
测试脚本:
create table table_1 (table_1_id2 bigint)
GO
ALTER TABLE table_1
ADD table_1_id BIGINT;
exec('UPDATE table_1 SET table_1_id = table_1_id2;')
go
drop table table_1