sql >> Database >  >> RDS >> Sqlserver

Ongeldige kolomnaamfout bij het aanroepen van insert nadat de tabel is gemaakt

SQL Server probeert de hele batch te compileren. Als de tabel al bestaat, wordt deze gecompileerd volgens de reeds bestaande definitie. De instructie die naar de nieuwe kolommen verwijst, compileert niet en dus wordt de batch nooit uitgevoerd.

U moet de verklaringen met de nieuwe definitie groeperen in een nieuwe batch. Als u dit in SSMS uitvoert, voegt u gewoon een GO . in

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

Anders zou u de gewraakte regel in een onderliggende batch kunnen uitvoeren

    EXEC(N'INSERT INTO [dbo].[Table2]([Number], [Name]) VALUES(-1, N''Default value'');')



  1. MySQL-fout bij het bewerken van product in Magento

  2. Het standaard gebruikerswachtwoord instellen in PostgreSQL

  3. een database maken in mysql vanuit java

  4. DDL- en DML-instructies in één script combineren