gpt4 book ai didi

sql-server - 创建表后调用插入时出现 "Invalid column name"错误

转载 作者:行者123 更新时间:2023-12-03 15:02:47 28 4
gpt4 key购买 nike

我正在使用 SSMS 开发 SQL 脚本,它对数据库进行了一些更改:

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 中插入一些默认值.

  • 当我尝试执行此脚本时,出现以下错误:

    Msg 207, Level 16, State 1, Line 262 Invalid column name 'Number'.
    Msg 207, Level 16, State 1, Line 262 Invalid column name 'Name'.



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

    我究竟做错了什么?

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

    更新 .

    我已添加 PRINT调用(参见上面的脚本)。消息窗口中没有任何内容,除了错误消息。所以,脚本没有被执行......发生了什么?

    最佳答案

    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'');')

    关于sql-server - 创建表后调用插入时出现 "Invalid column name"错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16165803/

    28 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com