调用插入时“无效列名称”错误表创建后(“Invalid column name” error whe

2019-08-31 21:46发布

我开发的SQL脚本,使用SSMS,这使得在数据库中的一些变化:

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

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

-- some statements

COMMIT TRANSACTION;

如果Table1有一个专栏,叫Table2_Id ,那么数据库有两个表( Table1Table2 )和它们之间的外键关系。 在这种情况下,我需要:

  • 下降外键关系FK_Table1_Table2_Table2_Id ;
  • 删除外键列Table1.Table2_Id ;
  • Table2 ;
  • 重新创建Table2 ,使用新表模式;
  • 插入一些默认值Table2

当我试图执行这个脚本,我得到这些错误:

消息207,级别16,状态1,行262无效列名“数字”。
消息207,级别16,状态1,行262无效列名“姓名”。

看起来像SQL Server使用旧架构Table2 (这的确还没有这些列),但是这怎么可能,如果表刚刚用新模式创建?

我究竟做错了什么?

服务器版本的SQL Server 2012(SP1) - 11.0.3128.0(X64)。

UPDATE。

我添加PRINT电话(见上面的脚本)。 有没有什么消息窗口,除了错误消息。 那么,是不是正在执行的脚本...这是怎么回事?

Answer 1:

SQL Server试图编译整个批次。 如果该表已经存在,那么它会根据预先存在的定义编译。 引用新列声明不编译等批处理永远不会执行。

您需要使用组新定义到一个新一批的语句。 如果您在SSMS运行此只需插入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

否则,你可以运行在子一批违规行

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


文章来源: “Invalid column name” error when calling insert after table created