Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Fehler aufgrund eines ungültigen Spaltennamens beim Aufrufen der Einfügung nach der Erstellung der Tabelle

SQL Server versucht, den gesamten Stapel zu kompilieren. Wenn die Tabelle bereits vorhanden ist, wird sie gemäß der bereits vorhandenen Definition kompiliert. Die Anweisung, die auf die neuen Spalten verweist, wird nicht kompiliert, und daher wird der Stapel nie ausgeführt.

Sie müssen die Anweisungen mit der neuen Definition in einem neuen Batch gruppieren. Wenn Sie dies in SSMS ausführen, fügen Sie einfach ein GO ein

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

Andernfalls könnten Sie die fehlerhafte Zeile in einem untergeordneten Stapel ausführen

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