“Invalid column name” error when calling insert after table created

后端 未结 1 1389
旧时难觅i
旧时难觅i 2020-12-11 02:26

I\'m developing SQL script, using SSMS, which makes some changes in database:

USE MyDatabase;

BEGIN TRANSACTION;

-- some statements

PRINT(N\'#1\');

IF (E         


        
相关标签:
1条回答
  • 2020-12-11 02:53

    SQL Server tries to compile the whole batch. If the table already exists then it will compile according to the pre-existing definition. The statement referencing the new columns doesn't compile and so the batch never executes.

    You need to group the statements using the new definition into a new batch. If you are running this in SSMS just insert a GO

    USE MyDatabase;
    
    BEGIN TRANSACTION;
    
    -- some statements
    
    PRINT(N'#1');
    
    IF (EXISTS (SELECT * FROM INFORMATION_SCHEMA.COLUMNS WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Table1' AND COLUMN_NAME = 'Table2_Id'))
    BEGIN
        ALTER TABLE [dbo].[Table1] DROP CONSTRAINT [FK_Table1_Table2_Table2_Id];
        ALTER TABLE [dbo].[Table1] DROP COLUMN [Table2_Id];
        DROP TABLE [dbo].[Table2];
    
        PRINT(N'Table2 was dropped.');
    END
    
    GO
    
    PRINT(N'#2');
    
    IF (NOT EXISTS (SELECT * FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = N'dbo' AND TABLE_NAME = N'Table2'))
    BEGIN
        CREATE TABLE [dbo].[Table2]
        (
            [Id] INT NOT NULL PRIMARY KEY IDENTITY,
            [Number] INT NOT NULL UNIQUE,
            [Name] NVARCHAR(200) NOT NULL,
            [RowVersion] TIMESTAMP NOT NULL
        );
    PRINT(N'Table2 was re-created.');
        INSERT INTO [dbo].[Table2]([Number], [Name]) VALUES(-1, N'Default value');
    PRINT(N'Default value was inserted in Table2.');
    END
    
    COMMIT
    

    Otherwise you could run the offending line in a child batch

        EXEC(N'INSERT INTO [dbo].[Table2]([Number], [Name]) VALUES(-1, N''Default value'');')
    
    0 讨论(0)
提交回复
热议问题