sql >> Databasteknik >  >> RDS >> Sqlserver

Fel vid ogiltig kolumnnamn vid anrop av infoga efter att tabellen skapats

SQL Server försöker kompilera hela batchen. Om tabellen redan finns kommer den att kompileras enligt den redan existerande definitionen. Uttalandet som hänvisar till de nya kolumnerna kompileras inte och därför körs partiet aldrig.

Du måste gruppera satserna med den nya definitionen i en ny batch. Om du kör detta i SSMS infogar du bara en 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

Annars kan du köra den felande raden i en underordnad batch

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



  1. GROUP_CONCAT i IN Subquery

  2. Konvertera en Postgresql-databas från SQL_ASCII, som innehåller blandade kodningstyper, till UTF-8

  3. Hur ställer man in variabel från en SQL-fråga?

  4. Java säger hela tiden att den inte kan hitta jdbc mysql-drivrutinen