创建列并在同一事务中插入其中?

Nen*_*lep 10 t-sql sql-server transactions alter-table

是否可以在同一个事务中创建一个列并向其插入值?这是升级脚本的一部分.我在网上找到了以下方法,但它不起作用; 我收到一个错误:Invalid column name 'IndexNumber'..我假设这是因为事务尚未创建列,因此没有任何内容可以插入.

我脚本的相关部分:

Print 'Beginning Upgrade'
Begin Transaction
    -- --------------------------------------------------------------------
    USE [MyDatabase];

    /* Widgets now can be ordered and the order can be modified */
    ALTER TABLE [dbo].[Widgets] ADD [IndexNumber] [int] NULL;

    DECLARE @ind INT 
    SET @ind = 0 
    UPDATE [dbo].[Widgets]
    SET @ind = [IndexNumber] = @ind + 1;

    ALTER TABLE [dbo].[Widgets] ALTER COLUMN [IndexNumber] [int] NOT NULL;
    -- --------------------------------------------------------------------
Commit tran
Print 'Upgrade completed'
Run Code Online (Sandbox Code Playgroud)

[IndexNumber]不是标识列的原因是它必须是可编辑的.

Dam*_*ver 18

如果您不想将代码拆分为单独的批处理,另一种方法是使用EXEC创建嵌套范围/批处理:

Print 'Beginning Upgrade'
Begin Transaction
    -- --------------------------------------------------------------------
    USE [MyDatabase];

    /* Widgets now can be ordered and the order can be modified */
    ALTER TABLE [dbo].[Widgets] ADD [IndexNumber] [int] NULL;

    EXEC('DECLARE @ind INT 
    SET @ind = 0 
    UPDATE [dbo].[Widgets]
    SET @ind = [IndexNumber] = @ind + 1;');

    ALTER TABLE [dbo].[Widgets] ALTER COLUMN [IndexNumber] [int] NOT NULL;
    -- --------------------------------------------------------------------
Commit tran
Print 'Upgrade completed'
Run Code Online (Sandbox Code Playgroud)

原始代码无法工作的原因是因为它在运行之前尝试编译整个批处理 - 编译失败,所以它甚至从未启动事务,让我们改变表.