Azure SQL Server:仅在执行前一个命令后才执行SQL命令

问题描述 投票:0回答:1

我有一个在 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
sql sql-server azure
1个回答
0
投票

改为回答:

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
© www.soinside.com 2019 - 2024. All rights reserved.