Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Błąd nieprawidłowej nazwy kolumny podczas wywoływania wstawiania po utworzeniu tabeli

SQL Server próbuje skompilować całą partię. Jeśli tabela już istnieje, zostanie skompilowana zgodnie z wcześniej istniejącą definicją. Instrukcja odwołująca się do nowych kolumn nie kompiluje się, więc partia nigdy nie jest wykonywana.

Musisz zgrupować instrukcje przy użyciu nowej definicji w nową partię. Jeśli używasz tego w SSMS, po prostu wstaw 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

W przeciwnym razie możesz uruchomić obraźliwą linię w grupie podrzędnej

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



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Czy istnieje LastIndexOf w SQL Server?

  2. Jak ustawić poniedziałek jako pierwszy dzień tygodnia w SQL Server

  3. Znalezienie rodzica najwyższego poziomu w SQL

  4. Klauzula VALUES w SQL Server

  5. SQL zmienia dane tabeli w bardziej zwartą formę